【问题标题】:Dataframe: shift expanding mean with groupby数据框:使用 groupby 移位扩展均值
【发布时间】:2015-12-31 03:13:22
【问题描述】:

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

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

我尝试过的方法包括在 groupby 中添加 .shift(1) 并尝试对 [:-1] 进行切片,但我无法让它工作。也想过引入辅助列,但不知道如何保留原始索引。

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

【问题讨论】:

    标签: python pandas average


    【解决方案1】:

    这就是你要找的吗?计算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
    

    【讨论】:

    • 亲爱的@Stefan 感谢您的回答,这非常有效!在我拥有之前:df2['homewin_at_home'] = df2.groupby('home')['hw'].apply(pd.expanding_mean).shift(1) 并没有改变计算。我知道 lambda 的用途,所以我认为我的错误是将shift() 放在错误的位置?我说的对吗?
    • 确实,通过将.shift() 拉到.apply() 中,lambda 表示的匿名函数会移动每个组的expanding_mean 的结果,而不是所有组的结果。跨度>
    • 如何重写此代码来处理弃用警告:FutureWarning: pd.expanding_mean 已被 Series 弃用,并将在未来版本中删除,替换为 Series.expanding(min_periods=1) .mean()
    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2018-02-26
    • 2018-06-22
    相关资源
    最近更新 更多