首页 > 解决方案 > groupby 和 sum 两列并在 pandas 中设置为一列

问题描述

我有以下数据框:

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

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

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

非常感谢您的建议。

谢谢

泽普。

标签: pythonpython-3.xpandaspandas-groupby

解决方案


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

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()with 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()

推荐阅读