Панды меняют форму на основе префиксов - PullRequest
0 голосов
/ 31 марта 2019

У меня есть кадр данных Pandas со следующими столбцами

game_id, date, country, winner_name, winner_age, ... winner_ranking, loser_name, loser_age, ... loser_ranking
1        1/2/10  UK .     Ben          21               12            Michael     22 .    13

Я хочу изменить его формат на следующий

game_id, date, country, competitor, name, age, ranking 
 1       1/2/10 UK       winner    Ben    21   12
 1       1/2/10 UK       loser     Michael 22   13

Т.е. для каждого столбца, начинающегося с префикса winner_'или' loser_ ', удалите этот префикс и разделите победителя и проигравшего на разные строки.Список переменных победителя и проигравшего довольно длинный, поэтому он не очень полезен, если мне нужно жестко кодировать.

Вот как я сейчас это делаю, мне интересно, если, например, есть более аккуратный подходиспользуя расплав?

winner_df = combined_df.loc[:,[x for x in colnames if 'loser_' not in x]]
winner_df.columns = [c.replace('winner_','') for c in winner_df.columns]
winner_df['competitor'] = 'winner'
loser_df = combined_df.loc[:,[x for x in colnames if 'winner_' not in x]]
loser_df.columns = [c.replace('loser_','') for c in loser_df.columns]
loser_df['competitor'] = 'loser'
long_df = winner_df.append(loser_df,sort=False)

1 Ответ

1 голос
/ 31 марта 2019

Сначала создайте MultiIndex из всех столбцов без столбцов с разделителем на DataFrame.set_index, затем создайте MultiIndex в столбцах с Series.str.split и последним изменением формы на DataFrame.stack с DataFrame.reset_index и rename столбец:

df = df.set_index(['game_id','date','country'])

df.columns = df.columns.str.split('_', expand=True)
df = df.stack(0).reset_index().rename(columns={'level_3':'competitor'})
print (df) 
   game_id    date country competitor  age     name  ranking
0        1  1/2/10      UK      loser   22  Michael       13
1        1  1/2/10      UK     winner   21      Ben       12
...