【问题标题】:How to get means of columns each X rows from several csv files如何从多个 csv 文件中获取每 X 行的列的平均值
【发布时间】:2020-08-12 06:10:48
【问题描述】:

这几天我一直在思考这个问题:

  • 我在 csv 文件中有几个数据帧,它们具有所有相同的格式(列名、行名),我想计算每个文件每一行的平均值,然后将其保存在输出 csv 文件中。就像这样:
import glob

import csv

with open('result.csv', 'w', newline='') as f_output:

    csv_output = csv.writer(f_output)

    for filename in glob.glob('F*.csv'):
        print (filename)
        with open (filename, newline='') as f_input:

            csv_input = csv.reader(f_input)
            header = next(csv_input)
            averages = [] #making a list for averages 

            for col in zip(*csv_input):
                averages.append(sum(float(x) for (x) in col) / len(col))


        csv_output.writerow([filename] + averages)
  • 但实际上我需要每 18 行(因为每行 = 1 分钟)每个数据帧的每个列的平均值,不包括标题(因为那是一个字符串)。所以我一直试图在 for 循环中只选择前 18 行这样的内容
df = pd.read_csv(df,skiprows=0, nrows = 18) #to get only first 18 minutes'

但这是 1)不起作用(我认为因为它不适用于读者) 2)不理想,因为我实际上只想将所有 dfs 分成 18 行的块,然后计算每行的平均值。

任何提示都会非常有帮助,谢谢!

更新

“也许您可以向我们展示一个小样本数据框(包含 4-5 列和行)并向我们展示您想要的输出(假设您需要每 2 行而不是每 18 行)。”

这是每个文件的示例 df

      col1       col2       col3     col4        col5        col6
0   1.228516    61.228516   1.0     418.808284  957.419867  1025.554374
1   61.228516   121.228516  1.0     207.864712  694.581742  814.149004  
2   121.228516  181.228516  1.0     140.516367  370.653176  809.100268  
3   181.228516  241.228516  1.0     140.274964  448.755593  885.196647  
4   241.228516  301.228516  1.0     117.079110  312.173256  1907.873698

我想计算每个列的前两行 (0,1) 的平均值,我们在这里说 forl col6。 所以我的输出将是 (1025.554374+814.149004)/2 #definition of算术平均值。

我只需要在我的所有 csv 文件中使用它,但每 18 行

希望现在更清楚了,谢谢!

【问题讨论】:

  • 欢迎来到 SO,@Vera!听起来您有两个不同的问题:读取文件和分块计算均值。读取文件时出了什么问题?
  • 另外,不清楚是否要每一行的平均值(“我要计算每一行的平均值”),每一列(“我实际上需要每列的平均值[n] "),或者每 18 行这些东西的某个版本。也许您可以向我们展示一个小样本数据框(包含 4-5 列和行)并向我们展示您想要的输出(假设您希望每 2 行而不是每 18 行输出一次)。
  • 嗨@ASGM,感谢您的快速回复!读取文件在 for 循环中工作正常,但我不知道如何集成(以及如何编写)将每个 csv 文件拆分为 18 行块的函数。如果我在 for 循环中导入文件时可以这样做,那将是理想的。请参阅我对上面第二个问题的回答
  • 非常感谢@ASGM,您的解释为我解决了问题!我正在尝试添加新的代码行,在输出中告知平均值属于每 4 行(0、1、2、3)的文件。

标签: python pandas csv dataframe mean


【解决方案1】:

我建议不要使用 for 循环,而是加载整个数据框并使用 groupbyfloor division

df.groupby(df.index // 18).mean()

您不需要 for 循环来对所有文件执行此操作:

def group_mean(df):
    return df.groupby(df.index // 18).mean()
df = pd.concat([group_mean(pd.read_csv(fname)) for fname in glob.glob('F*.csv')])
df.to_csv('result.csv')

如果您出于某种原因想在 for 循环中执行此操作:

dfs = []
for fname in fname in glob.glob('F*.csv'):
    df = pd.read_csv(fname)
    dfs.append(df.groupby(df.index // 18).mean())
pd.concat(dfs).to_csv('result.csv')

如果您真的想一次加载 18 行的数据帧(只有在您的数据非常庞大时才有意义),您可以使用 chunksize 运算符:

reader = pd.read_csv('result.csv', chunksize=18)
for chunk in reader:
    print(chunk.mean())

【讨论】:

  • 抱歉,我的帖子中可能不清楚,但“结果”文件实际上已经是所有列的平均值的结果(仅给出一个值作为输出)。所以我需要对我导入的每个文件进行分块(上面我是用 glob 做的)。现在用一个例子更新了上面的帖子,希望现在更清楚
  • 好的,非常感谢!现在问题是我想对一个目录中的所有 .csv 文件执行此操作。就像我现在可以写这个data = pd.read_csv('FD_HRV_pp1.csv') data.head() datanew = data.groupby(data.index // 17).mean() datanew.head() 然后像datanew.to_csv('FD_HRV_pp1_chunkmeans.csv') 一样保存它。如何创建一个对所有文件执行此操作的 for 循环?理想的情况是在原始版本中使用 glob 导入所有 csv 文件并创建一个 for 循环
  • 如果您需要任何其他说明,请告诉我,提前谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2014-05-30
  • 2020-02-04
  • 1970-01-01
相关资源
最近更新 更多