【问题标题】:groupby and sum two columns and set as one column in pandasgroupby 和 sum 两列并在 pandas 中设置为一列
【发布时间】:2018-12-02 19:15:42
【问题描述】:

我有以下数据框:

import pandas as pd
data = pd.DataFrame()
data['Home'] = ['A','B','C','D','E','F']
data['HomePoint'] = [3,0,1,1,3,3]
data['Away'] = ['B','C','A','E','D','D']
data['AwayPoint'] = [0,3,1,1,0,0]

我想按 ['Home', 'Away'] 列分组并将名称更改为 Team。然后我喜欢将 homepoint 和 awaypoint 加起来作为 Points 的名称。

     Team      Points
      A           4
      B           0
      C           4
      D           1
      E           4
      F           3

我该怎么做? 我正在使用以下帖子尝试不同的方法: Link

但我无法获得我想要的格式。

非常感谢您的建议。

谢谢

泽普。

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    一个简单的方法是创建两个由团队索引的新系列:

    home = pd.Series(data.HomePoint.values, data.Home)
    away = pd.Series(data.AwayPoint.values, data.Away)
    

    那么,你想要的结果是:

    home.add(away, fill_value=0).astype(int)
    

    请注意,home + away 不起作用,因为 F 队从未参加过客场比赛,因此对他们来说会导致 NaN。所以我们使用Series.add()fill_value=0

    一个复杂的方法是使用DataFrame.melt():

    goo = data.melt(['HomePoint', 'AwayPoint'], var_name='At', value_name='Team')
    goo.HomePoint.where(goo.At == 'Home', goo.AwayPoint).groupby(goo.Team).sum()
    

    或者从另一个角度来看:

    ooze = data.melt(['Home', 'Away'])
    ooze.value.groupby(ooze.Home.where(ooze.variable == 'HomePoint', ooze.Away)).sum()
    

    【讨论】:

    • 感谢约翰为我提供了不同的选择。非常感谢您的帮助。
    【解决方案2】:

    您可以成对地连接输入数据框的列。然后使用groupby.sum

    # calculate number of pairs
    n = int(len(df.columns)/2)+1)
    
    # create list of pairwise dataframes
    df_lst = [data.iloc[:, 2*i:2*(i+1)].set_axis(['Team', 'Points'], axis=1, inplace=False) \
              for i in range(n)]
    
    # concatenate list of dataframes
    df = pd.concat(df_lst, axis=0)
    
    # perform groupby
    res = df.groupby('Team', as_index=False)['Points'].sum()
    
    print(res)
    
      Team  Points
    0    A       4
    1    B       0
    2    C       4
    3    D       1
    4    E       4
    5    F       3
    

    【讨论】:

    • 感谢 JPP 的建议。我很感激
    猜你喜欢
    • 2016-12-23
    • 2023-01-18
    • 2019-09-29
    • 2023-01-05
    • 2021-11-01
    • 2020-07-09
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多