У меня есть следующий фрейм данных:
import pandas as pd
data = pd.DataFrame()
data['Home'] = ['A','B','C','D','E','F']
data['HomePoint'] = [3,0,1,1,3,3]
data['Away'] = ['B','C','A','E','D','D']
data['AwayPoint'] = [0,3,1,1,0,0]
Я хочу группировать столбцы ['Home', 'Away'] и изменять имя как Team. Тогда мне нравится суммировать точку и точку в качестве имени как Points.
Team Points
A 4
B 0
C 4
D 1
E 4
F 3
Как мне это сделать? Я пытался использовать другой подход, используя следующую запись: Link
Но я не смог получить формат, который хотел.
Большое спасибо за ваш совет.
Спасибо
Zep.
Простым способом является создание двух новых серий, индексированных командами:
home = pd.Series(data.HomePoint.values, data.Home)
away = pd.Series(data.AwayPoint.values, data.Away)
Затем вы получите результат:
home.add(away, fill_value=0).astype(int)
Обратите внимание, что home + away
не работает, потому что команда F никогда не проигрывала, поэтому для них будет NaN. Поэтому мы используем Series.add()
с fill_value=0
.
Сложный способ использования DataFrame.melt()
:
goo = data.melt(['HomePoint', 'AwayPoint'], var_name='At', value_name='Team')
goo.HomePoint.where(goo.At == 'Home', goo.AwayPoint).groupby(goo.Team).sum()
Или с другой стороны:
ooze = data.melt(['Home', 'Away'])
ooze.value.groupby(ooze.Home.where(ooze.variable == 'HomePoint', ooze.Away)).sum()
Вы можете конкатенировать, попарно, столбцы вашего входного фрейма. Затем используйте groupby.sum
.
# calculate number of pairs
n = int(len(df.columns)/2)+1)
# create list of pairwise dataframes
df_lst = [data.iloc[:, 2*i:2*(i+1)].set_axis(['Team', 'Points'], axis=1, inplace=False) \
for i in range(n)]
# concatenate list of dataframes
df = pd.concat(df_lst, axis=0)
# perform groupby
res = df.groupby('Team', as_index=False)['Points'].sum()
print(res)
Team Points
0 A 4
1 B 0
2 C 4
3 D 1
4 E 4
5 F 3