我有一个像这样设置的数据帧。
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
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