簡體   English   中英

將多個 CSV 文件連接到一個 Dataframe 並輸出到 Master CSV

[英]Concatenating multiple CSV files into a Dataframe and outputing to Master CSV

我正在尋找可以幫助我完成以下腳本的人。 我正在嘗試將一個月的 csv 文件連接到一個“主文件”中。 這些文件真的很大,所以我希望在腳本中做一些事情來縮短它們。 這是我遇到的問題:

  1. 文件不同,但標題相同。 我不確定如何僅在第一個文件上獲取標題。 我用 next(f) 擺脫了其余的。
  2. 如何將“輸出”目錄添加為 output1.csv 的目標文件夾
  3. 最后,我一直在嘗試使用 pandas-如何使用它們刪除第 1、2、4 列以及第 90 列之后的所有內容。我還想知道如何在將其寫入 csv 之前先將其設為數據框- 在我寫之前,我想在輸出文件的末尾添加一些計算。

到目前為止,這是我的腳本,我使用文件的時間戳找到正確的月份 '201510' = 十月

import csv
import os
import sys
import pandas as pd

Source = r'F:\backup\finalized 2'
Output = r'F:\Tom\Python'

for root, dirs, files in os.walk((os.path.normpath(Source)), topdown=False):
    for name in files:
        if name.startswith('201510') and name.endswith('client.csv'):
            print "Found", name
            SourceFolder = os.path.join(root, name)
            with open(SourceFolder + "", 'r') as f:
                next(f)
                for line in csv.reader(f, delimiter=','):
                    with open('output1.csv','ab') as fout:
                        wr = csv.writer(fout)
                        wr.writerow(line)

以下是我想添加到數據框/CSV 末尾的計算:

df['ten_avg'] = df.iloc[:, 30:50].sum(axis=1).astype('int64') / 20      
df['twenty_avg'] = df.iloc[:, 30:70].sum(axis=1).astype('int64') / 40

我認為您只能使用熊貓進行處理。

您需要所有文件的標題,因為您需要通過 csvs 的標題將它們連接到一個大文件。

我認為最好將輸出文件的路徑和名稱一起定義: OutputCSV = r'F:\Tom\Python\output.csv'

讀取csv的最佳方法是只讀取這些列,這正是下一步處理所需要的。 您可以使用帶有參數usecol 的函數 read_csv 它是列的過濾器,需要列的名稱。 您可以通過讀取一個帶有標題的文件來獲取它們(所有行都可以刪除)。 列表中的列名正在處理 - 刪除 3.item(第一項具有索引 0),將它們切片[2:89] ,然后使用變量cols讀取所有 csv。

您可以循環獲取所有文件,使用usecols=cols從函數read_csv獲取數據農場,該函數附加到數據幀列表中。 然后將此列表連接到一個大輸出數據幀df

處理后輸出 df 通過函數to_csv寫入文件。

import pandas as pd
import os

Source = r'F:\backup\finalized 2'
OutputCSV = r'F:\Tom\Python\output.csv'

normSource = os.path.normpath(Source)

#find column names and delete 1,2,4, and more as 90th columns
#read one csv
names = pd.read_csv(os.path.join(normSource,'header.csv'), sep=",")
#column names to list
cols = names.columns.tolist()
print cols
#the first item has index 0, so you need delete 0, 1, 3, 89, 90, 91.. item

#delete 3 item
del cols[3]

#get 2,4,5,...89 item
cols = cols[2:89]
print cols
dfs = []
#create empty df for output
d = pd.DataFrame()

for root, dirs, files in os.walk(normSource, topdown=False):
    for name in files:
        print root
        print name
        if name.startswith('201510') and name.endswith('client.csv'):
            #only read columns from list cols
            dfs.append(pd.read_csv(os.path.join(root, name), sep=',', index_col=False, usecols=cols))
            df = pd.concat(dfs, ignore_index=True)

#all files in one dataframe
print df.head()

df['ten_avg'] = df.iloc[:, 30:50].sum(axis=1).astype('int64') / 20      
df['twenty_avg'] = df.iloc[:, 30:70].sum(axis=1).astype('int64') / 40
print df.head()

#output to csv, remove index
df.to_csv(OutputCSV, sep=",", index=False)

Pandas Dataframe 在這里應該派上用場。

使用以下命令導入數據框中的每個文件:

import pandas as pd
df = pd.DataFrame.from_csv('<csvfilename>',index_col=False,parse_dates=False)

然后將其附加到主數據框:

master = master.append(df,ignore_index=True)

對數據框執行操作,然后使用以下命令導出:

master.to_csv('<csv_file_name>')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM