【问题标题】:Concatenating multiple CSV files into a Dataframe and outputing to Master CSV将多个 CSV 文件连接到一个 Dataframe 并输出到 Master CSV
【发布时间】:2015-11-18 10:42:39
【问题描述】:

我正在寻找可以帮助我编写以下脚本的人。我正在尝试将一个月的 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

【问题讨论】:

  • 连接你不需要csv.readercsv.writer。你可以使用fout.write(f.read())

标签: python csv pandas


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 太棒了!第一次工作,也正是我想要的。非常感谢您的帮助!
  • 谢谢。极好的。如果你愿意,你可以投票给我的答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 2021-04-03
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2017-12-15
    • 2019-07-15
    相关资源
    最近更新 更多