簡體   English   中英

如何根據多個列共有的值對數據框進行分組?

[英]How do I groupby a dataframe based on values that are common to multiple columns?

我試圖基於在兩列中找到的值聚合一個數據框。 我正在嘗試聚合數據幀,以使在A列或B列中具有某些值X的行聚合在一起。

更具體地說,我正在嘗試做這樣的事情。 假設我有一個dataframe 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數組中獲取結果時使用.values ,在concat時請使用ignore_index=True ,這是為了避免在按列名和索引名求和時出現大熊貓陷阱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM