Как сгруппировать фрейм данных на основе значений, которые являются общими для нескольких столбцов? - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь объединить фрейм данных на основе значений, найденных в двух столбцах.Я пытаюсь объединить фрейм данных таким образом, чтобы строки, имеющие некоторое значение X в столбце A или столбце B, были объединены вместе.

Более конкретно, я пытаюсь сделать что-то подобное.Допустим, у меня есть дата-фрейм 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

Однако прохождение цикла кажется менее элегантным.И поскольку у меня раньше была эта проблема со многими уникальными идентификаторами, мне было интересно, есть ли способ сделать это без использования цикла, поскольку это кажется мне очень неэффективным.

1 Ответ

0 голосов
/ 07 октября 2018

Решение в 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 при конкатате, чтобы избежать ловушек пандкогда он суммируется по именам столбцов и индексов.

...