提问者:小点点

查找特定行数pandas数据帧上值的平均值


我有一个像这样设置的数据帧。

Value
1
2
3
4
5
1
2
3
4
5
6

我想取列中每三个值(或每三行)的平均值,从第一个值开始。 例如,流程看起来像(1+4+2+5)/4。 这等于3,然后我将它分配给一个新的列。 有没有办法使用某种iloc代码来实现这一点?

下一个条目是(2+5+3+6)/4=4

预期产出为:

Value  Mean 1st entry  Mean 2nd entry
    1  3              4
    2
    3
    4
    5
    1
    2
    3
    4
    5
    6

共2个答案

匿名用户

df[::3]['Value'].mean()  

这得到了您想要的,但是您还想将它分配给一个列,那么您希望结果是什么样子的呢?

匿名用户

下面是一种基于numpy的方法,使用view_as_windows对列值进行滚动窗口视图,步长为3。 使用这种方法,如果不存在整个窗口,则省略输出。

from skimage.util import view_as_windows

a = df['Value'].to_numpy()
# strided view of a with a step size of 3
w = view_as_windows(a, len(a)//3, step=3)
# missing values not present in strided view (incomplete window)
missing = a[w.size:]
prev_means = w.mean(0)
# construct new array with missing values and means of w
# if no missing values, the mean is kept
prev_means[:len(missing)] = a[w.size:]
means = np.vstack([w, prev_means]).mean(0)
# new df column
new_col = np.full(len(a), np.nan)
new_col[:len(means)] = means
df['means'] = new_col
print(df)

    Value     means
0       1  3.000000 # (1+4+2+5)/4
1       2  4.000000 # (2+5+3+6)/4
2       3  2.666667 # (3+1+4)/3
3       4       NaN
4       5       NaN
5       1       NaN
6       2       NaN
7       3       NaN
8       4       NaN
9       5       NaN
10      6       NaN