【问题标题】:Pandas dataframe building summary tablePandas 数据框构建汇总表
【发布时间】:2021-03-25 21:03:39
【问题描述】:

例子df:

id 主场 客场 胜利者 失败者 胜利者得分 失败者得分 0 A B A B 20 10 1 C D D C 20 5 2 A D D A 30 0

我的目标是建立一个赢/输/支持/反对的表格。最终结果:

Team W L Total for Total against
A 1 1 20 40
B 0 1 10 20
C 0 1 5 20
D 2 0 50 5

我可以使用groupby('winner/loser') 来获得胜负,但我无法正确地使用groupby 来获得总分(和平均值,但这非常相似)。我的主要问题是当一支球队从未赢过一场比赛时,我最终会得到 NaN。

我现在的方法是:

by_winner = df.groupby('winner').sum()
by_loser = df.groupby('loser').sum()

overall_table['score_for'] = by_winner.score + by_loser.score

我什至不知道如何表达这个问题,但我希望能够从一行 = 一场比赛的概念运行这些统计数据,但我不知道如何按获胜者分组失败者,这样我就可以一次得到所有团队的总和。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    让我们试试吧:

    counts = pd.get_dummies(df[['winner','loser']].stack()).sum(level=1).T
    
    
    winner_score = (df.groupby('winner')[['winner_score','loser_score']].sum()
       .rename(columns={'winner_score':'for', 'loser_score':'against'})
    )
    
    loser_score = (df.groupby('loser')[['winner_score','loser_score']].sum()
       .rename(columns={'winner_score':'against', 'loser_score':'for'})
    )
    
    pd.concat((counts, winner_score.add( loser_score, fill_value=0) ), axis=1)
    

    输出:

       winner  loser  against   for
    A       1      1     40.0  20.0
    B       0      1     20.0  10.0
    C       0      1     20.0   5.0
    D       2      0      5.0  50.0
    

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 1970-01-01
      • 2016-10-12
      • 2020-02-24
      • 2019-08-18
      • 2016-11-12
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      相关资源
      最近更新 更多