如何在文件夹中打开多个csv文件,取一列的平均值并使用python保存在单独的文件中?

时间:2017-03-17 19:08:00

标签: python csv pandas numpy

我是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']

我知道上面的代码非常简陋,所以任何帮助都会非常感谢大家!

2 个答案:

答案 0 :(得分:1)

假设这些CSV文件中的第一列是小数或浮点数,您实际上并不需要解析整行。只需在第一个分隔符处拆分并解析第一个标记。 numpypandas也没有真正的优势。只需使用内置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执行相同操作的一种方法。但是,我建议暂时坚持使用csvpandas对象模型很复杂,很难绕过你的脑袋。

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和计算可以用一个语句完成。