我正在找人帮我处理下面的脚本。我正在尝试将一个月的csv文件连接到“主文件”中。文件非常大,所以我希望在脚本中做一些事情来缩短它们。这就是我遇到的问题:
到目前为止,这是我的脚本,我使用文件的时间戳找到正确的月'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
答案 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>')
如果这有帮助,请告诉我。 快乐的编码。