#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