数据帧:使用groupby转移扩展均值

时间:2015-12-31 03:13:22

标签: python pandas average

我希望扩展均值给出不包括当前项目的结果,即项目之前的平均值。这就是我正在寻找的东西:

d = { 'home' : ['A', 'B', 'B', 'A', 'B', 'A', 'A'], 'away' : ['B', 'A','A', 'B', 'A', 'B', 'B'],
 'aw' : [1,0,0,0,1,0,np.nan],'hw' : [0,1,0,1,0,1, np.nan]}

df2 = pd.DataFrame(d, columns=['home', 'away', 'hw', 'aw'])
df2.index = range(1,len(df2) + 1)
df2['homewin_at_home'] = df2.groupby('home')['hw'].apply(pd.expanding_mean)

print df2

结果:

  home away  hw  aw  homewin_at_home
1    A    B   0   1         0.000000
2    B    A   1   0         1.000000
3    B    A   0   0         0.500000
4    A    B   1   0         0.500000
5    B    A   0   1         0.333333
6    A    B   1   0         **0.666667**
7    A    B NaN NaN         0.666667

突出显示的数字应为0.5:' A'在此条目之前赢得了2场比赛中的1场比赛= 6.而不是结果包括这场比赛产生0.66。实际输出应为:

  home away  hw  aw  homewin_at_home
1    A    B   0   1              NaN
2    B    A   1   0              NaN
3    B    A   0   0         1.000000
4    A    B   1   0         0.000000
5    B    A   0   1         0.500000
6    A    B   1   0         0.500000
7    A    B NaN NaN         0.666667

我尝试过的事情包括添加.shift(1)并尝试在群组中切片[:-1],但我无法让它发挥作用。还考虑引入辅助列,但无法确定如何保留原始索引。

我问了一个相关的问题here,但我更喜欢这种方法来进行group-apply-split例程。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:4)

这是你要找的吗?计算expanding_meanshifts结果。

df['homewin_at_home'] = df.groupby('home')['hw'].apply(lambda x: pd.expanding_mean(x).shift())

或者,对于更新版本的pandas:

df['homewin_at_home'] = df.groupby('home')['hw'].apply(lambda x: x.expanding().mean().shift())

  home away  hw  aw  homewin_at_home
1    A    B   0   1              NaN
2    B    A   1   0              NaN
3    B    A   0   0         1.000000
4    A    B   1   0         0.000000
5    B    A   0   1         0.500000
6    A    B   1   0         0.500000
7    A    B NaN NaN         0.666667