#python #pandas #pivot
#питон #панды #поворотный
Вопрос:
Добрый вечер, у меня есть фрейм данных, который я хочу изменить. для некоторых столбцов существуют переменные с повторяющимися идентификаторами, и я хочу, чтобы повторяющиеся значения отображались в виде новых строк
мои данные выглядят следующим образом, и я хочу, чтобы идентификаторы были в виде строки, группа — в виде столбца, а варианты выбора — в виде значений. если для каждого идентификатора в группе выбрано несколько вариантов, то строка должна быть реплицирована, как показано ниже. когда я использую pivot, я в конечном итоге просто получаю среднее значение или сумму комбинированных значений, например, 11.5 для id i1, group1. все советы очень приветствуются, спасибо
import pandas as pd
import numpy as np
df = pd.DataFrame({'id': ['i1','i1','i1','i2','i2','i2','i2','i2','i3','i3'],
'group': ['group1','group1','group2','group3','group1','group2','group2','group3','group1','group2'],
'choice':[12,11,12,14,11,19,9,7,8,9]})
pd.DataFrame({'id': ['i1','i1','i2','i2','i3'],
'group1': [12,11,11,np.nan,8],
'group2': [12,np.nan,19,9,9],
'group3':[np.nan,np.nan,14,7,np.nan]})
Ответ №1:
Используйте GroupBy.cumcount
с Series.unstack
и DataFrame.droplevel
:
g = df.groupby(['id','group']).cumcount().add(1)
df = (df.set_index(['id','group', g])['choice']
.unstack(level=1)
.droplevel(level=1)
.rename_axis(None,axis=1)
.reset_index())
print (df)
id group1 group2 group3
0 i1 12.0 12.0 NaN
1 i1 11.0 NaN NaN
2 i2 11.0 19.0 14.0
3 i2 NaN 9.0 7.0
4 i3 8.0 9.0 NaN