Совокупная сумма, основанная на множественном условии во фрейме данных

#python #pandas #dataframe #cumulative-sum

#python #pandas #фрейм данных #накопительная сумма

Вопрос:

Я застрял на проблеме, которая, я думаю, не сложная, но я не вижу простого способа…

У меня есть фрейм данных (stats_match), подобный этому, с 11 000 строками:

 domicile              exterieur              season home   away
FC Metz               Stade Rennais FC       1999   0.0     0.0
Paris Saint-Germain   ESTAC Troyes           1999   1.0     0.0     
Olympique Lyonnais    Montpellier Hérault SC 1999   1.0     2.0
Girondins de Bordeaux SC Bastia              1999   3.0     2.0
RC Strasbourg Alsace  RC Lens                1999   1.0     0.0
AS Monaco             AS Saint-Etienne       1999   2.0     2.0     
  

Я хотел бы получить совокупную сумму количества голов, забитых командами за сезон, и только по фактическим командам Лиги 1 (потому что я прогнозирую удаление строк без команды из фактического сезона). Фактические команды хранятся в другом фрейме данных (stade) следующим образом :

 equipe                  stade                   capacity
Angers SCO              Stade Raymond Kopa      17048   
Nîmes Olympique         Stade des Costières     18364   
Girondins de Bordeaux   Matmut Atlantique       42115   
Girondins de Bordeaux   Stade Chaban-Delmas     33290   
RC Strasbourg Alsace    Stade de la Meinau      26109   
LOSC                    Stade Pierre Mauroy     25000
  

Я попробовал это :

 d = defaultdict(list)
for index, row in stats_match.iterrows():
if ((row.domicile in list(stade.equipe)) amp; (row.exterieur in list(stade.equipe))):
    d[row.domicile].append([row.saison,row.but_domicile])
    d[row.exterieur].append([row.saison,row.but_exterieur])
elif (row.domicile in list(stade.equipe)):
    d[row.domicile].append([row.saison,row.but_domicile])
else:
    d[row.exterieur].append([row.saison,row.but_exterieur])
  

Код работает и выдает мне словарь моей команды со всеми забитыми голами (дома и в гостях).
Я не знаю, самый ли это простой способ, потому что теперь я не знаю, как выполнить мою накопительную сумму с условием для сезона с:

  • np.add.accumulate()
  • np.cumsum()

И затем, как правильно добавить ее в нужное место в моем фрейме данных? Я подумал добавить индекс в свой словарь во время цикла, может ли это сработать?

Большое спасибо.

Ответ №1:

Вы можете сделать это изначально в pandas .

Во-первых, если я вас правильно понял, вам нужны только команды в stade :

 filtered_stats_match = stats_match[stats_match[['domicile', 'exterieur']].isin(stade['equipe']).any(axis=1)]
  

После этого вы можете просто выполнить groupby , чтобы получить накопительную сумму:

 filtered_stats_match.groupby(['domicile', 'season'])[['home', 'away']].cumsum()
  

Комментарии:

1. действительно, это то, что я намереваюсь сделать, однако, когда я копирую ваш код, он возвращает мне только две строки … вместо 11000