如何使用python查找各种.csv文件的所有列的平均值,并且仅使单个标头和第一标签列保持相同?

时间:2019-04-24 21:09:47

标签: python csv

因此,我在结构相同的目录中具有多个.csv文件,第一行作为标题,第一列作为标签。说文件1如下:

name,value1,value2,value3,value4,......
name1,10,20,0,0,...
name2,20,30,0,0,...
name3,30,40,0,0,...
name4,40,50,0,0,...
....

文件2:

name,value1,value2,value3,value4,......
name1,20,30,0,0,...
name2,30,40,0,0,...
name3,40,50,0,0,...
name4,50,60,0,0,...
....

所有.csv文件具有相同的结构,具有相同的行数和列数。

我想要的是这样的东西:

name,value1,value2,value3,value4,......
name1,15,25,0,0,...
name2,25,35,0,0,...
name3,35,45,0,0,...
name4,45,55,0,0,...
....

最后一个文件中所有值列的位置将是所有.csv文件中那些列中对应值的平均值。因此,在结果文件的value1下,我应该具有(10 + 20 + ... + ...)/ n,依此类推。

.csv文件的数量不是固定的,所以我认为我需要一个循环。

如何在Linux计算机上使用python脚本实现这一目标。

使用awk,我正在这样做:

awk '
    BEGIN {FS=OFS=","}
    FNR==1 {header=$0}      # header line
    FNR>1 {
        sum[FNR,1] = $1     # names column
        for (j=2; j<=NF; j++) {
            sum[FNR,j] += $j
        }
    }
    END {
        print header
        files = ARGC - 1    # number of csv files
        for (i=2; i<=FNR; i++) {
            $1 = sum[i,1]   # another treatment for the 1st column
            for (j=2; j<=NF; j++) {
                $j = sum[i,j] / files
            }
            print
        }
    }' *.csv

但是我意识到每个文件中的列名可能都不相同。所以说,如果name1仅存在于前两个文件中,而没有出现在第三个文件中,那么我必须显示一条消息,指出第三个文件中缺少它,但仍要从其他两个文件中计算平均值。 我认为使用字典和计数器可以做到这一点,但是我不确定该怎么做。

2 个答案:

答案 0 :(得分:1)

如果您只想使用标准库,则示例如下:

导入csv     从统计数据导入均值

filename1 = 'f1.csv'
filename2 = 'f2.csv'
output = 'output.csv'

with open(filename1, 'r') as f1, open(filename2, 'r') as f2, open(output, 'r') as out:
    r1 = csv.reader(f1)
    r2 = csv.reader(f2)
    w = csv.writer(out)
    w.writerows(next(r1))
    next(r2)

    for line1, line2 in zip(r1, r2):
        w.writerows([line1[0]] + list(map(lambda a: (a[0]+a[1])//2, zip(line1[1:], line2[1:]))))

如果您想使用pandas,则为:

将熊猫作为pd导入

df1 = pd.read_csv('filename1.csv', index_col=0, header=0)
df2 = pd.read_csv('filename2.csv', index_col=0, header=0)

out = (df1 + df2) // 2

out.to_csv('output.csv')

答案 1 :(得分:1)

扩展posted by Mr Morganpandas选项,您还可以使用:

filename_list=['csv1.csv','csv2.csv']
dfs=[]
for fname in filename_list:
    dfs.append(pd.read_csv(fname,index_col=0))

averages = pd.concat([each.stack() for each in dfs],axis=1)\
             .apply(lambda x:x.mean(),axis=1)\
             .unstack()

averages.to_csv("csvAvg.csv")