【问题标题】:Calculate Mean for each CSV row计算每个 CSV 行的平均值
【发布时间】:2017-01-26 22:05:20
【问题描述】:

我有 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"]))

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

【问题讨论】:

    标签: python csv


    【解决方案1】:

    在这种情况下,Pandas 真的很有帮助。您可以避免所有循环并将 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
    

    【讨论】:

    • 如果你有足够的内存应该没问题
    • 有没有办法只打印平均值?像 print df_concat['meanvalue'] without the index?
    • for a in range (0,5356,1): data=df_concat['meanvalue'][a] 为我做了,因为我正好需要 5356 行
    • 更新了答案,现在这段代码只读取前 5356 行并打印没有索引的平均值
    【解决方案2】:

    在这种情况下,您可能只想使用join 制作一张大熊猫表。连接值需要是相应数据框的索引。

    这样,您可以在 x 和 y 值相同的地方加入。您最终将得到 5 列,x,y,接下来的 3 列将是您要计算的值。现在,您可以简单地创建一个新列来测量数据框行中最后 3 个值的平均值。 x 或 y,取唯一的作为索引。

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

    您所做的 SQL 等价物是对 y 值的内部连接,我假设每个 csv 文件都是唯一的。

    【讨论】:

    • 但是我如何才能读取特定列的一行?就像 Row1 Column2 Row2 Column2 和 np.mean(csv_data[:, 2]) 它只查看列
    • This answer 应该可以帮助您获取各列的平均值。
    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多