Dataframe:使用 groupby 移动扩展均值

问题描述 投票:0回答:2

我想要扩展均值给出排除当前项目的结果,即项目的先前平均值。这就是我正在寻找的:

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”在索引 = 6 的条目之前赢得了 2 场主场比赛中的 1 场。相反,结果包括这场比赛产生
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,但我更喜欢这种方法而不是组应用拆分例程。任何帮助表示赞赏。

python pandas average
2个回答
6
投票

这是您要找的吗?计算

expanding_mean
shifts
结果。

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

0
投票

虽然 Stefananswer 会满足您的要求,但如果您有一个大数据集,使用

apply
将显着延长执行时间。

为了避免这种情况,您可以使用第二个

groupby
并与原始数据连接回来:

pd.concat(
    [
        df,
        df.rename(columns={"hw": "homewin_at_home"})
        .set_index("home", append=True)
        .groupby("home")["homewin_at_home"].shift()
        .groupby("home").expanding().mean()
        .droplevel(-1)
        .droplevel(0),
    ],
    axis=1,
)

输出:

  home away   hw   aw  homewin_at_home
1    A    B  0.0  1.0              NaN
2    B    A  1.0  0.0              NaN
3    B    A  0.0  0.0         1.000000
4    A    B  1.0  0.0         0.000000
5    B    A  0.0  1.0         0.500000
6    A    B  1.0  0.0         0.500000
7    A    B  NaN  NaN         0.666667
© www.soinside.com 2019 - 2024. All rights reserved.