Поскольку ваша операция по существу добавляет две суммы сумм, рассмотрим pandas.groupby
с join
, не требующим for
l oop:
def TeamsPointsDict(df, teamname):
agg_df = (df.groupby(['HomeTeam'])['HP'].sum()
.to_frame()
.query("HomeTeam == @teamname")
.join(df.groupby(['AwayTeam'])['AP'].sum())
.sum(axis=1)
)
return agg_df.to_dict()
print(TeamsPointsDict(df, 'Man City'))
Для демонстрации со случайными данными:
import numpy as np
import pandas as pd
teams = ['Liverpool', 'West Ham', 'Bournemouth', 'Burnley', 'Crystal Palace',
'Watford', 'Tottenham', 'Leicester', 'Newcastle', 'Man United',
'Arsenal', 'Aston Villa', 'Brighton', 'Everton', 'Norwich',
'Southampton', 'Man City', 'Sheffield United', 'Chelsea', 'Wolves']
### DATA BUILD
np.random.seed(41320)
random_df = pd.DataFrame({'HomeTeam': np.random.choice(teams, 500),
'HP': np.random.randint(1, 10, 500),
'AwayTeam': np.random.choice(teams, 500),
'AP': np.random.randint(1, 10, 500)})
def TeamsPointsDict(df, teamname):
agg_df = (df.groupby(['HomeTeam'])['HP'].sum()
.to_frame()
.query("HomeTeam == @teamname")
.join(df.groupby(['AwayTeam'])['AP'].sum())
.sum(axis=1)
)
return agg_df.to_dict()
print(TeamsPointsDict(random_df, 'Man City'))
# {'Man City': 238}