Предполагается, что у вас есть ровно две строки на gameID
, и вы хотите сгруппировать по этому идентификатору.(Предполагается также, что я понимаю вопрос.)
Улучшенное решение
С учетом кадра данных df
, например
gameID Won/Lost Home Away metric2 metric3 metric4 team1 team2 team3 team4
0 2017020001 1 1 0 10 10 10 1 0 0 0
1 2017020001 0 0 1 10 10 10 0 1 0 0
2 2017020002 1 1 0 10 10 10 1 0 0 0
3 2017020002 0 0 1 10 10 10 0 1 0 0
, вы можетеиспользуйте pd.merge
(и некоторые данные) как это:
>>> is_home = df['Home'] == 1
>>> home = df[is_home].drop(['Home', 'Away'], axis=1).add_prefix('h_').rename(columns={'h_gameID':'gameID'})
>>> away = df[~is_home].drop(['Won/Lost', 'Home', 'Away'], axis=1).add_prefix('a_').rename(columns={'a_gameID':'gameID'})
>>> pd.merge(home, away, on='gameID')
gameID h_Won/Lost h_metric2 h_metric3 h_metric4 h_team1 h_team2 h_team3 h_team4 a_metric2 a_metric3 a_metric4 a_team1 a_team2 a_team3 a_team4
0 2017020001 1 10 10 10 1 0 0 0 10 10 10 0 1 0 0
1 2017020002 1 10 10 10 1 0 0 0 10 10 10 0 1 0 0
(я сохранил префикс для Won/Lost
, потому что это указывает, что это статистика для домашней команды. Кроме того, если кто-нибудь знает, какдобавьте префиксы более элегантно, без необходимости переименовывать gameID
, пожалуйста, оставьте комментарий.)
Исходная попытка
Вы можете применить следующую функциюпосле группировки
def munge(group):
is_home = group.Home == 1
wonlost = group.loc[is_home, 'Won/Lost'].reset_index(drop=True)
group = group.loc[:, 'metric2':]
home = group[is_home].add_prefix('h_').reset_index(drop=True)
away = group[~is_home].add_prefix('a_').reset_index(drop=True)
return pd.concat([wonlost, home, away], axis=1)
... вот так:
>>> df.groupby('gameID').apply(munge).reset_index(level=1, drop=True)
Won/Lost h_metric2 h_metric3 h_metric4 h_team1 h_team2 h_team3 h_team4 a_metric2 a_metric3 a_metric4 a_team1 a_team2 a_team3 a_team4
gameID
2017020001 1 10 10 10 1 0 0 0 10 10 10 0 1 0 0
2017020002 1 10 10 10 1 0 0 0 10 10 10 0 1 0 0