【问题标题】:How to make new columns out of every second row in a pandas df如何在熊猫 df 中每隔一行创建新列
【发布时间】:2021-07-27 21:16:35
【问题描述】:

我有一个难以处理的 NBA 数据数据框。我想将 df1 更改为 df2,方法是让两支球队在同一行的比赛中得分两次,以从两支球队的角度来看比赛结果:

df1

GameID     TeamID     TeamAbb     PTS
   0        1001        TOR        99
   0        1023        ATL        86
   1        1004        DAL        102
   1        1003        POR        100
   2        1015        LAL        96
   2        1029        MIL        85

df2

GameID     Team1ID     Team2ID     Team1Abb      Team2Abb    Team1PTS    Team2PTS
   0        1001        1023         TOR           ATL          99          86
   0        1023        1001         ATL           TOR          86          99
   1        1004        1003         DAL           POR          102         100
   1        1003        1004         POR           DAL          100         102

所以本质上是数据框的一种扩展。

【问题讨论】:

    标签: python pandas data-manipulation data-cleaning


    【解决方案1】:

    试试:

    df2 = df1.set_index(['GameID', df1.groupby('GameID').cumcount()+1]).unstack()
    df2.columns=[f'{i}_{j}' for i, j in df2.columns]
    df2.reset_index()
    

    输出:

      GameID  TeamID_1  TeamID_2 TeamAbb_1 TeamAbb_2  PTS_1  PTS_2
    0       0      1001      1023       TOR       ATL     99     86
    1       1      1004      1003       DAL       POR    102    100
    2       2      1015      1029       LAL       MIL     96     85
    

    详情:

    • 使用'GameID'来groupbycumcount获得1和2。
    • 然后,扁平化由 groupby 使用列表创建的多索引列标题 理解
    • 最后,reset_index

    根据以下评论更新:

    #Create home team and visiting team records
    g = df.groupby('GameID').cumcount()
    dfh = df.set_index(['GameID', g + 1])
    dfv = df.set_index(['GameID', 2 - g])
    
    dfh = dfh.unstack()
    dfh.columns = [f'{i}_{j}' for i, j in dfh.columns]
    
    dfv = dfv.unstack()
    dfv.columns = [f'{i}_{j}' for i, j in dfv.columns]
    
    # concatenate home and visiting records
    pd.concat([dfh, dfv]).sort_index().reset_index()
    

    输出:

       GameID  TeamID_1  TeamID_2 TeamAbb_1 TeamAbb_2  PTS_1  PTS_2
    0       0      1001      1023       TOR       ATL     99     86
    1       0      1023      1001       ATL       TOR     86     99
    2       1      1004      1003       DAL       POR    102    100
    3       1      1003      1004       POR       DAL    100    102
    4       2      1015      1029       LAL       MIL     96     85
    5       2      1029      1015       MIL       LAL     85     96
    

    【讨论】:

    • 工作就像一个魅力,斯科特。谢谢!绝对需要一点技巧。
    • @NickA 关键技巧是使用 cumcountgroupby 为每个 GameID 创建 1 和 2。一旦你掌握了这个技巧,你就会一直这样做来“扩大”数据帧。
    • @NickA 这是一套完全不同的逻辑。我是否会回到旧问题并根据此要求创建一个新问题?
    • @NickA 没关系,我用你的新预期结果更新了这个解决方案。
    • 嘿,非常感谢!它和你一样好用。欣赏它。
    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    相关资源
    最近更新 更多