因此,我在结构相同的目录中具有多个.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仅存在于前两个文件中,而没有出现在第三个文件中,那么我必须显示一条消息,指出第三个文件中缺少它,但仍要从其他两个文件中计算平均值。 我认为使用字典和计数器可以做到这一点,但是我不确定该怎么做。
答案 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 Morgan的pandas
选项,您还可以使用:
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")