从CSV文件中计算每n行的平均值

9

我有一个包含25000个行的csv文件。我想将每30行的平均值放入另一个csv文件中。

我用以下9行作为示例,新的csv文件有3行 (3, 1, 2):

|   H    |
 ========
|   1    |---\
|   3    |   |--->| 3 |
|   5    |---/
|  -1    |---\
|   3    |   |--->| 1 |
|   1    |---/
|   0    |---\
|   5    |   |--->| 2 |
|   1    |---/

我做了什么:

import numpy as np
import pandas as pd

m_path = "file.csv"

m_df = pd.read_csv(m_path, usecols=['Col-01']) 
m_arr =  np.array([])
temp = m_df.to_numpy()
step = 30
for i in range(1, 25000, step):
    arr = np.append(m_arr,np.array([np.average(temp[i:i + step])]))

data = np.array(m_arr)[np.newaxis]

m_df = pd.DataFrame({'Column1': data[0, :]})
m_df.to_csv('AVG.csv')

这个方法很有效,但是是否还有其他的选项可以实现同样的效果?


当你用“更好”这个词时,从客观的角度来看,你指的是什么? - TylerH
那并没有回答我的问题。像“有没有更好的解决方案”这样基于观点的问题在Stack Overflow上是不被接受的。“更好”的标准是主观的。 - TylerH
“summarized”不再清晰或客观,就像“better”一样。如果您有代码或特定目标的具体问题,请详细说明。否则,您应该在Code Review上提问,这允许对代码进行更基于意见的审查。 - TylerH
3个回答

8

你可以使用整数除法 step 来获取连续的分组,然后将其传递给 groupby 以聚合 mean

step = 30
m_df = pd.read_csv(m_path, usecols=['Col-01']) 
df = m_df.groupby(m_df.index // step).mean()

或者:

df = m_df.groupby(np.arange(len(dfm_df// step).mean()

样本数据:

step = 3
df = m_df.groupby(m_df.index // step).mean()
print (df)
   H
0  3
1  1
2  2

2
你可以使用 DataFrame.rolling 来获取滚动平均值,然后使用切片来过滤结果。
df.rolling(3).mean()[2::3].reset_index(drop=True)
     a
0  3.0
1  1.0
2  2.0

1

可能更简单的方法是全部使用numpy完成。

import numpy as np
x = np.array([1, 3, 5, -1, 3, 1, 0, 5, 1 ])
steps = 3
for i in range(0, len(x), steps):
    avg = np.average(x[i:i+steps])
    print (f'average starting at el {i} is {avg}')

这将打印:

average starting at el 0 is 3.0
average starting at el 3 is 1.0
average starting at el 6 is 2.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接