例如,我在数据帧中有循环,在每组中通过(id(当我在当前行[i]中时,我想获得同一组中所有先前行的平均值
eg//在(a(组中,当我在第4行时,我想得到(20,18,19(的平均值当我在第5行时,我想得到(20,18,19,20(的平均值
等等用于数据帧中的所有行和组
id | total |
---|---|
a | 20 |
a | 18 |
a | 19 |
a | 20 |
a | 21 |
a | 15 |
b | 13 |
b | nan |
b | 15 |
b | 5 |
您可以使用pandagroupby()
和expanding()
。按id分组,使用展开来获得运行输出,然后平均值为mean((:
df.groupby('id').expanding().mean().reset_index()
id total
0 a 20.000000
1 a 19.000000
2 a 19.000000
3 a 19.250000
4 a 19.600000
5 a 18.833333
6 b 13.000000
7 b 13.000000
8 b 14.000000
9 b 11.000000
要得到平均值,但不包括每一行,您可以再次分组,并将这些数字移动1。全线代码:
out = df.groupby('id').expanding().mean().reset_index().groupby('id').shift(1)
level_1 total
0 NaN NaN
1 0.0 20.00
2 1.0 19.00
3 2.0 19.00
4 3.0 19.25
5 4.0 19.60
6 NaN NaN
7 6.0 13.00
8 7.0 13.00
9 8.0 14.00
然后,您可以将level_1增加1,并将其合并回原始数据帧的索引,以获得所需的结果:
out['level_1'] = out['level_1'] + 1
(df.reset_index().merge(out, left_on='index', right_on='level_1',
how='left', suffixes=[None, ' average'])[['id', 'total', 'total average']])
id total total average
0 a 20.0 NaN
1 a 18.0 20.00
2 a 19.0 19.00
3 a 20.0 19.00
4 a 21.0 19.25
5 a 15.0 19.60
6 b 13.0 NaN
7 b NaN 13.00
8 b 15.0 13.00
9 b 5.0 14.00
完整代码:
out = df.groupby('id').expanding().mean().reset_index().groupby('id').shift(1)
out['level_1'] = out['level_1'] + 1
df = (df.reset_index().merge(out, left_on='index', right_on='level_1',
how='left', suffixes=[None, ' average'])[['id', 'total', 'total average']])
您可以使用expanding()
定义计算窗口,使用groupby()
按索引分组,然后重置索引以恢复数据帧的原始形状,如:
df = df.groupby('id').expanding(1).mean()
df.reset_index(inplace=True)
df.drop('level_1', axis=1, inplace=True)
print(df)
输出:
id total
0 a 20.000000
1 a 19.000000
2 a 19.000000
3 a 19.250000
4 a 19.600000
5 a 18.833333
6 b 13.000000
7 b 13.000000
8 b 14.000000
9 b 11.000000