如何根据多列共有的值对数据框进行分组?
How do I groupby a dataframe based on values that are common to multiple columns?
我正在尝试根据在两列中找到的值来聚合数据框。我正在尝试聚合数据框,以便将 A 列或 B 列中具有某个值 X 的行聚合在一起。
更具体地说,我正在尝试做这样的事情。假设我有一个数据框 gameStats:
awayTeam homeTeam awayGoals homeGoals
Chelsea Barca 1 2
R. Madrid Barca 2 5
Barca Valencia 2 2
Barca Sevilla 1 0
...等等
我想构建一个数据框,以便在我的行中有类似的内容:
team goalsFor goalsAgainst
Barca 10 5
一个明显的解决方案,因为唯一元素集很小,是这样的:
for team in teamList:
aggregateDf = gameStats[(gameStats['homeTeam'] == team) | (gameStats['awayTeam'] == team)]
# do other manipulations of the data then append it to a final dataframe
但是,通过一个循环似乎不太优雅。而且由于我之前遇到过许多唯一标识符的问题,我想知道是否有一种方法可以在不使用循环的情况下执行此操作,因为这对我来说似乎效率很低。
解法有2个,先计算每支球队主场和客场的进球数,然后合并。类似于:
goals_when_away = gameStats.groupby(['awayTeam'])['awayGoals', 'homeGoals'].agg('sum').reset_index().sort_values('awayTeam')
goals_when_home = gameStats.groupby(['homeTeam'])['homeGoals', 'awayGoals'].agg('sum').reset_index().sort_values('homeTeam')
然后合并它们
np_result = goals_when_away.iloc[:, 1:].values + goals_when_home.iloc[:, 1:].values
pd_result = pd.DataFrame(np_result, columns=['goal_for', 'goal_against'])
result = pd.concat([goals_when_away.iloc[:, :1], pd_result], axis=1, ignore_index=True)
注意 .values
当求和得到 numpy 数组的结果时, ignore_index=True
当 concat 时,这些是为了避免按列和索引名称求和时的 pandas 陷阱。
我正在尝试根据在两列中找到的值来聚合数据框。我正在尝试聚合数据框,以便将 A 列或 B 列中具有某个值 X 的行聚合在一起。
更具体地说,我正在尝试做这样的事情。假设我有一个数据框 gameStats:
awayTeam homeTeam awayGoals homeGoals
Chelsea Barca 1 2
R. Madrid Barca 2 5
Barca Valencia 2 2
Barca Sevilla 1 0
...等等
我想构建一个数据框,以便在我的行中有类似的内容:
team goalsFor goalsAgainst
Barca 10 5
一个明显的解决方案,因为唯一元素集很小,是这样的:
for team in teamList:
aggregateDf = gameStats[(gameStats['homeTeam'] == team) | (gameStats['awayTeam'] == team)]
# do other manipulations of the data then append it to a final dataframe
但是,通过一个循环似乎不太优雅。而且由于我之前遇到过许多唯一标识符的问题,我想知道是否有一种方法可以在不使用循环的情况下执行此操作,因为这对我来说似乎效率很低。
解法有2个,先计算每支球队主场和客场的进球数,然后合并。类似于:
goals_when_away = gameStats.groupby(['awayTeam'])['awayGoals', 'homeGoals'].agg('sum').reset_index().sort_values('awayTeam')
goals_when_home = gameStats.groupby(['homeTeam'])['homeGoals', 'awayGoals'].agg('sum').reset_index().sort_values('homeTeam')
然后合并它们
np_result = goals_when_away.iloc[:, 1:].values + goals_when_home.iloc[:, 1:].values
pd_result = pd.DataFrame(np_result, columns=['goal_for', 'goal_against'])
result = pd.concat([goals_when_away.iloc[:, :1], pd_result], axis=1, ignore_index=True)
注意 .values
当求和得到 numpy 数组的结果时, ignore_index=True
当 concat 时,这些是为了避免按列和索引名称求和时的 pandas 陷阱。