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

2024-10-16 20:47:48 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我在同一个目录中有不同的.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只出现在前两个文件中;不在第三个文件中,然后我必须显示一条消息,说它在第三个文件中丢失,但仍然计算其他两个文件的平均值。 我想用字典和计数器就可以了,但我不知道怎么做


Tags: 文件csvnameforheadersumvalue1name1
2条回答

展开pandas选项posted by Mr Morgan,您还可以使用:

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

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

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

相关问题 更多 >