Pandas pivot_table создать новый столбец для каждой записи - PullRequest
0 голосов
/ 29 января 2020

У меня есть pandas кадр данных, подобный этому

enter image description here

, и я хотел бы преобразовать его в следующее (без использования l oop!):

enter image description here

Есть идеи, как это сделать ??

Если изображения не отображаются:

У меня есть кадр данных с 2 столбцами: Имя и Хобби. И у меня есть следующие строки:

Anna drawing
Anna swimming
Anna skiing
Lisa running
Lisa singing
Tom drawing

И я хочу преобразовать его в кадр данных с 4 столбцами: Имя, Хобби 1, Хобби 2, Хобби 3. И иметь следующие строки:

Anna drawing swimming skiing
Lisa running singing NaN
Tom drawing NaN NaN

1 Ответ

0 голосов
/ 29 января 2020

Используйте gruopby и reset_index, чтобы создать числовой индекс c для каждого хобби в каждой группе имен. Изменить форму (unstack), чтобы получить матричный формат.

df = pd.DataFrame({'Name':['Anna','Anna','Anna','Lisa','Lisa','Tom' ],
                  'Hobby':['drawing','swimming','skiing','running','singing','drawing']})

result = (df.groupby('Name')['Hobby']
            .apply(lambda x:x.reset_index(drop=True))
            .unstack()
            .rename(columns=lambda x:f'Hobby {x+1}'))

Редактировать: комбинация двух хобби

df_merge = (df.merge(df, on='Name')
              .assign(Hobby_combi=lambda x:x.Hobby_x+'|'+x.Hobby_y)
              .loc[lambda x:x.Hobby_x!=x.Hobby_y]
              .groupby(['Name','Hobby_combi'])
              .size()
              .unstack()
              .reindex(df['Name'].unique())
              .fillna(0, downcast='infer'))

df_merge.sum()
...