我是python的新手,需要一些帮助。我尝试了各种代码,但似乎都没有,所以建议会很棒。
我有一个包含大约1500个csv文件的文件夹,每个文件包含多列数据。我需要取第一列名为“agr”的平均值,并将此值保存在不同的excel或csv文件中。如果我还可以以某种方式保存文件的名称及其平均值,那将是很好的,这样我就可以跟踪它来自哪个文件。文件名是crop_city(例如corn_omaha)。
import glob
import csv
import numpy as np
import pandas as pd
path = ('C:/test/*.csv')
for fname in glob.glob(path):
with open(fname) as csvfile:
agr = []
reader = csv.DictReader(fname)
print row['agr']
我知道上面的代码非常简陋,所以任何帮助都会非常感谢大家!
答案 0 :(得分:1)
假设这些CSV文件中的第一列是小数或浮点数,您实际上并不需要解析整行。只需在第一个分隔符处拆分并解析第一个标记。 numpy
或pandas
也没有真正的优势。只需使用内置sum
函数。
import glob
import os
path = ('test/*.csv') # using local dir for test
outfile.write("Filename,Sum\r\n") # header for output
with open('output.csv', 'w', newline='') as outfile:
for fname in glob.glob(path):
with open(fname) as csvfile:
next(csvfile) # skip header
outfile.writelines("{},{}\r\n".format(os.path.basename(fname),
sum(float(line.split(',', 1)[0].strip())
for line in csvfile)))
答案 1 :(得分:0)
与@tdelaney的回答相反,我不建议你依靠你正在加入第一列的事实限制你的代码;如果你需要下周与第三栏合作怎么办?通过构建您提供的代码,可以很容易地做到这一点。解析几千个文本文件不会让你失望。
csv.DictReader
构造函数会自动将其输入的第一行视为标题(除非您使用fieldnames
参数显式指定列名列表)。所以你的代码看起来像这样:
import csv
import glob
averages = []
for fname in glob.glob(path):
with open(fname, "rb") as csvfile:
reader = csv.DictReader(csvfile)
values = [ float(row["agr"]) for row in reader ]
avg = sum(values) / len(values)
averages.append((fname, avg))
列表averages
现在包含您想要的数字。这是你把它写到另一个CSV文件的方式:
with open("avegages.csv", "wb") as outfile:
writer = csv.writer(outfile)
writer.writerow(["File", "Average agr"])
for row in averages:
writer.writerow(row)
PS。由于您在导入中包含pandas
,因此这是使用pandas执行相同操作的一种方法。但是,我建议暂时坚持使用csv
。 pandas
对象模型很复杂,很难绕过你的脑袋。
averages = []
for fname in glob.glob(path):
data = pd.DataFrame.from_csv(fname)
averages.append((fname, data["agr"].mean()))
df_out = pd.DataFrame.from_records(averages, columns=["File", "Average agr"])
df_out.to_csv("averages.csv", index=False)
正如您所看到的,代码要短得多,因为文件i / o和计算可以用一个语句完成。