сводный df с дубликатами в качестве новых строк

#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