计算每个CSV行的平均值

时间:2017-01-25 19:50:44

标签: python csv

我有3个名为file1,file2,file3的csv文件。 每个CSV都填充3列和5653行:

1   0   -95
2   0   -94
3   0   -93
...
51  0   -93
0   1   -92
1   1   -91
2   1   -90
..

第一列是X变量第二列是y变量,第三列是我想要得到平均值的测量值。

我想做的是:

  • 读取文件1的第一行
  • 阅读第2行文件
  • 读取文件3的第一行,然后计算测量值的平均值。

例如:

file1 row1 -98 
file2 row1 -97
file3 row1 -95

mean 96,666666667

我想将这个意思写入具有以下格式的新csv文件

 1,0,mean_of_row1 (which would be 96,666666667)
 2,0,mean_of_row2
 3,0,mean_of_row3
 4,0,mean_of_row4

目前无法计算每个文件的测量列的平均值,并将其作为一行存储在结果文件中

import pandas as pd
import numpy as np

csv_file_list = ["file1.csv", "file2.csv", "file3.csv"]
result_csv = "result.csv"

with open(result_csv, 'wb') as rf:
    for idx, csv_file in enumerate(csv_file_list):
        csv_data = pd.read_csv(csv_file).values
        mean_measured = np.mean(csv_data[:, 2])
        rf.write(','.join([str(0), str(idx), str(mean_measured)+"\n"]))

但是如何实现我的意图呢? 谢谢到目前为止

2 个答案:

答案 0 :(得分:1)

在这种情况下,您可能只想使用join创建一个大型pandas表。连接值需要是相应数据帧的索引。

这样,您可以加入x和y值相同的位置。最终会得到5列x,y,以下3列将是您要计算的值。现在,您可以简单地创建一个新列,用于测量数据帧中一行中最后3个值的平均值。 x或y,无论哪个都是唯一的,都可以作为索引。

pandas merge函数可以帮助您根据行本身进行合并。

你正在做的SQL的等价物是y值的内连接,我假设每个csv文件都是唯一的。

答案 1 :(得分:1)

在这种情况下,熊猫真的很有帮助。您可以避免所有循环并巧妙地将csv读入数据帧。然后将所有三个数据帧合并为一个,并按行计算所需字段的pandas.DataFrame.mean

pandas.read_csv可以选择使用nrows参数来限制行数。

import pandas as pd

df1=pd.read_csv('file1.txt',names=['x1','Y1','Value1'],nrows=5356)
df2=pd.read_csv('file2.txt',names=['x2','Y2','Value2'],nrows=5356)
df3=pd.read_csv('text3.txt',names=['x3','Y3','Value3'],nrows=5356)

df_concat= pd.concat([df1,df2,df3], axis=1)
print df_concat


df_concat['meanvalue']=df_concat[['Value1','Value2','Value3']].mean(axis=1)
print(df_concat.to_csv(columns=['meanvalue'],index=False))

输出

meanvalue
-96.5
-97.0
-86.0
-95.0