Измените структуру данных panda указанным c способом. Часть 2 - PullRequest
1 голос
/ 24 февраля 2020

У меня есть другая заданная задача c для изменения формы панды.

У меня тот же python код

import pandas as pd

data = {'ID': [123, 123,124], 'Method': ['angular', 'angular','angular'], 'Colour': ['red', 'blue','Noir'], 'Size': [20, 30,10] }

df = pd.DataFrame (data, columns = ['ID','Method','Colour','Size'])
df

ID  Method  Colour  Size
123 angular red     20
123 angular blue    30
124 angular Noir    10

Со следующим кодом

resul = df.reset_index().set_index(['ID', 'Method', 'index']
                                   ).unstack().reset_index() #.groupby(['ID','Method'])

resul.columns = [i if j == '' else i + '_' + str(j)
                 for i, j in resul.columns.tolist()]
resul

Я получаю следующий результат

    ID  Method  Colour_0    Colour_1    Colour_2    Size_0  Size_1  Size_2
0   123 angular   red         blue        NaN         20.0    30.0   NaN
1   124 angular   NaN         NaN         Noir        NaN     NaN    10.0

Но нужно, чтобы код считал, сколько цветов имеет каждый идентификатор, а затем сохранил максимум (в связи с df идентификатор = 123 имеет два цвета и ID = 124 имеет один цвет). Таким образом, он сохранит номер два и должен создать только два цвета новостей (coulour_0 и colour_1) вместо 3. То же самое также для столбца Размер . Должно быть только два столбца. Таблица результатов должна выглядеть следующим образом:

    ID  Method  Colour_0    Colour_1    Size_0  Size_1  
0   123 angular   red         blue        20.0    30.0  
1   124 angular   Noir        NaN          10.0    NaN

Не имеет значения, в каком порядке подходит NaN для обоих.

Может кто-нибудь помочь мне? Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020

Вот один из способов использования pivot_table. Обратите внимание, что нам нужно создать столбцы поворотного информационного кадра, чтобы иметь нумерацию, мы можем go с GroupBy.cumcount:

g = df.groupby('ID').Colour.cumcount()
out = df.pivot_table(index=['ID', 'Method'], 
                     columns=g,
                     values=['Colour', 'Size'],
                     aggfunc='first')

# combine both levels in the MultiIndex column into one
out.columns = ['_'.join(map(str, t)) for t in out.columns]
print(out.reset_index())

   ID   Method  Colour_0 Colour_1  Size_0  Size_1
0  123  angular      red     blue    20.0    30.0
1  124  angular     Noir      NaN    10.0     NaN
1 голос
/ 24 февраля 2020

Вы можете использовать это:

resul = df.set_index(['ID', 'Method', df.groupby('ID')['Colour'].cumcount()]).unstack()
resul.columns = [f'{i}_{j}' for i, j in resul.columns]
resul = resul.reset_index()
print(resul)

Выход:

    ID   Method Colour_0 Colour_1  Size_0  Size_1
0  123  angular      red     blue    20.0    30.0
1  124  angular     Noir      NaN    10.0     NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...