我有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变量,第三列是我想要得到平均值的测量值。
我想做的是:
例如:
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"]))
但是如何实现我的意图呢? 谢谢到目前为止
答案 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