Pivot DataFrame Python работает только с pivot_table (), но не с set_index () и unstack () - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь повернуть следующий тип данных примера в кадре данных Pandas в Python. Я натолкнулся на пару других ответов stackoverflow, которые обсуждали, как сделать сводку: pivot_table Нет числовых типов для агрегирования

Однако, когда я использую pivot_table(), я могу поворачивать данные. Но когда я использую set_index() и unstack(), я получаю следующую ошибку:

AttributeError: у объекта 'NoneType' нет атрибута 'unstack'

Пример данных:

id  responseTime    label   answers
ABC 2018-06-24  Category_1  [3]
ABC 2018-06-24  Category_2  [10]
ABC 2018-06-24  Category_3  [10]
DEF 2018-06-25  Category_1  [7]
DEF 2018-06-25  Category_8  [10]
GHI 2018-06-28  Category_3  [7]

Желаемый вывод:

id  responseTime    category_1  category_2 category_3 category_8
ABC  2018-06-24           [3]     [10]         [10]       NULL
DEF  2018-06-25           [7]     NULL         NULL       [10]
GHI  2018-06-28           NULL    NULL         [7]        NULL

Это работает:

 df=pdDF.pivot_table(index=['items_id','responseTime'], columns='label', values='answers', aggfunc='first') 

Это не работает:

pdDF.set_index(['items_id','responseTime','label'], append=True, inplace=True).unstack('label')

Я также использовал pdDF[pdDF.isnull().any(axis=1)], чтобы убедиться, что в столбце ответов нет данных NULL. Я также использовал append=False, но произошла та же ошибка.

Из других потоков кажется, что set_index() и unstack() более эффективны, чем pivot_table(). Я также не хочу использовать pivot_table(), потому что для этого требуется функция агрегирования, а мой столбец ответов не содержит числовых данных. Я не хотел использовать значение по умолчанию (mean()), поэтому я использовал first(). Любая идея о том, почему один метод работает, а другой нет?

1 Ответ

0 голосов
/ 08 сентября 2018

AttributeError: у объекта 'NoneType' нет атрибута 'unstack'

Когда вы используете inplace = True в set_index, он изменил кадр данных на месте.Ничего не возвращается (None).Таким образом, вы не можете использовать unstack для None объекта.

inplace: boolean, по умолчанию False

Изменить DataFrame на месте (не создавать новый объект)

Использование:

df1 = pdDF.set_index(['items_id','responseTime','label']).unstack('label')    
print(df1)

# Output:

id  responseTime    category_1  category_2 category_3 category_8
ABC  2018-06-24           [3]     [10]         [10]       NULL
DEF  2018-06-25           [7]     NULL         NULL       [10]
GHI  2018-06-28           NULL    NULL         [7]        NULL
...