Частичное транспонирование панд - PullRequest
0 голосов
/ 07 февраля 2019

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

исходные данные:

ID  subID  values_A  
--  -----  --------  
A    aaa     10      
B    baa     20      
A    abb     30      
A    acc     40      
C    caa     50      
B    bbb     60      

Повернуть один раз:

 pivot_table( df, index = ["ID", "subID"] )

Вывод:

ID  subID  values_A 
--  -----  -------- 
A    aaa     10     
     abb     30     
     acc     40     

B    baa     20     
     bbb     60     

C    caa     50     

Что я хочу сделать (исправить столбцы ['ID'] и частичное транспонирование):

ID  subID_1  value_1   subID_2  value_2  subID_3  value_3
--  -------  -------  --------  -------  -------  -------
A    aaa       10       abb       30       acc       40
B    baa       20       bbb       60       NaN       NaN 
C    caa       50       NaN       NaN      NaN       NaN 

то, что я знаю, максимальное значение подсчета subID, которые находятся под каждым идентификатором.

Мне не нужны какие-либо расчетные значения при развороте и транспозиции фрейма данных.

Пожалуйста, помогите

1 Ответ

0 голосов
/ 07 февраля 2019

Используйте cumcount для счетчика, создайте MultiIndex с помощью set_index, измените форму на unstack и отсортируйте первый уровень MultiIndex in columnsна sort_index.Последнее сглаживает его на list comprehension с reset_index:

g = df.groupby('ID').cumcount()

df = df.set_index(['ID', g]).unstack().sort_index(level=1, axis=1)
#python 3.6+
df.columns = [f'{a}_{b+1}' for a, b in df.columns]
#python bellow
#df.columns = ['{}_{}'.format(a, b+1) for a, b in df.columns]
df = df.reset_index()
print (df)
  ID subID_1  values_A_1 subID_2  values_A_2 subID_3  values_A_3
0  A     aaa        10.0     abb        30.0     acc        40.0
1  B     baa        20.0     bbb        60.0     NaN         NaN
2  C     caa        50.0     NaN         NaN     NaN         NaN
...