如何获得特定列的每组数据帧中第一行和当前行[i]之前的行之间的平均值



例如,我在数据帧中有循环,在每组中通过(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

最新更新