Преобразование только выбранных столбцов для транспонирования с использованием melt и pivot? - PullRequest
1 голос
/ 09 апреля 2020

У меня есть такой фрейм данных:

id  Gender        TV        Radio
0   M            Daily      Daily
1   F            Monthly    Weekly
2   M            Weekly     Weekly
3   F            Daily      Daily

Мне нужно изменить столбцы на значения, а значения на столбцы. Это мой желаемый вывод .

id  Gender             Daily    Monthly      Weekly
0   M                   TV       NaN          NaN
0   M                   Radio    NaN          NaN
1   F                   NaN      TV           Weekly
2   M                   NaN      NaN          TV
2   M                   NaN      NaN          Radio
3   F                   TV       NaN          NaN
3   F                   Radio    NaN          NaN

Я использую melt + pivot, но я теряю информацию. Вот что я использую.

idx = ['id', 'Gender']
m = df.melt(idx).pivot_table(index=idx,columns='value',values='variable',aggfunc='first')
out = m.reset_index(idx).rename_axis(index=None,columns=None)

Но я получаю только первое значение. Например, если ежедневно происходит для телевидения и радио, то я получаю только первое значение .. Я знаю, что я собираю только первое, но не знаю, какую функцию я могу использовать, чтобы получить все значения.

 id    Gender               Daily   Monthly      Weekly
    0   M                   TV       NaN          NaN
    1   F                   NaN      TV           Weekly
    2   M                   NaN      NaN          TV
    3   F                   TV       NaN          NaN

1 Ответ

2 голосов
/ 09 апреля 2020

Используйте DataFrame.melt с GroupBy.cumcount для счетчика с дублирующимися значениями, а затем Series.unstack для изменения формы:

idx = ['id', 'Gender']
m = df.melt(idx)
m['g'] = m.groupby(idx).cumcount()
m = m.set_index(idx + ['g', 'value'])['variable'].unstack()
out = m.reset_index(idx).rename_axis(index=None,columns=None)
print (out)
   id Gender  Daily Monthly Weekly
0   0      M     TV     NaN    NaN
1   0      M  Radio     NaN    NaN
0   1      F    NaN      TV    NaN
1   1      F    NaN     NaN  Radio
0   2      M    NaN     NaN     TV
1   2      M    NaN     NaN  Radio
0   3      F     TV     NaN    NaN
1   3      F  Radio     NaN    NaN
...