将多个CSV文件连接到Dataframe并输出到Master CSV

时间:2015-11-18 10:42:40

标签: python csv pandas

我正在找人帮我处理下面的脚本。我正在尝试将一个月的csv文件连接到“主文件”中。文件非常大,所以我希望在脚本中做一些事情来缩短它们。这就是我遇到的问题:

  1. 文件不同,但标题相同。我不知道如何只在第一个文件上获取标题。我用next(f)来摆脱其余的。
  2. 如何将“输出”目录添加为output1.csv
  3. 的目标文件夹
  4. 最后,我一直在尝试使用pandas-如何使用它们删除第1,2列以及第90列之后的所有内容。我还想知道如何在写入之前先将其作为数据帧它到csv-我想在写之前在输出文件的末尾添加一些计算。
  5. 到目前为止,这是我的脚本,我使用文件的时间戳找到正确的月'201510'= 10月

    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)
    

    以下是我想要添加到dataframe / 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
    

2 个答案:

答案 0 :(得分:1)

我认为你只能用pandas进行处理。

您需要所有文件的标题,因为您需要通过csvs的标题将它们连接到一个大文件。

我认为更好的是一起定义输出文件的路径和名称:OutputCSV = r'F:\Tom\Python\output.csv'

阅读csv的最佳方法是只读这些列,下一步处理的确切需要。您可以将函数read_csv与参数usecol一起使用。它是列的过滤器,需要列的名称。您可以通过读取带有标题的文件来获取它们(可以删除所有行)。列表中的列名称正在处理 - 删除3.item(第一项具有索引0),按[2:89]切片,然后使用变量cols读取所有csv。

您获取循环中的所有文件,从read_csv函数获取带有usecols=cols的datafarme,这将附加到数据帧列表中。然后,此列表连接到一个大输出数据帧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)

答案 1 :(得分:0)

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>')

如果这有帮助,请告诉我。 快乐的编码。