сводная таблица панд - упорядоченные категории, вызывающие неожиданные поля - PullRequest
0 голосов
/ 08 февраля 2019

Использование python 3.7 и pandas 0.23.4.Я пытаюсь сделать сводные таблицы с упорядоченными категориальными данными.Если я включаю поля, промежуточные итоги, кажется, не в правильном порядке.

import pandas as pd
m='male'
f='female'

data = {'num': [0,1,2,3,4,5,6,7,8,9],
        'age': [1,2,2,3,3,3,3,1,2,3],
        'sex': [f,f,f,f,f,f,f,m,m,m]}
df = pd.DataFrame(data=data)

df['age1'] = pd.Categorical(df['age'],categories=[3,2,1],ordered=True)
df['sex1'] = pd.Categorical(df['sex'],categories=[m,f],ordered=True)
pd.pivot_table(df,values='num',index='age1',columns='sex1',aggfunc='count',margins=True)

Вывод (неправильный порядок полей, суммы «Все» не в правильных строках или столбцах):

sex1  male  female  All
age1                   
3        1       4    2
2        1       2    3
1        1       1    5
All      7       3   10

Ожидаемый результат (правильный порядок полей):

sex1  male  female  All
age1                   
3        1       4    5
2        1       2    3
1        1       1    2
All      3       7   10

В этом примере может быть лучше создать категории с order = False.Однако большая часть моих данных автоматически упорядочивается (с использованием pd.cut), поэтому я хотел бы знать, является ли это предполагаемым поведением, и если да, есть ли способ удалить упорядочение для категории, которая была создана с помощью заказа?

Редактировать - вот пример использования pd.cut.Я изменил значения столбца age, чтобы они отображались в обратном порядке.

import pandas as pd
m='male'
f='female'
data = {'num': [0,1,2,3,4,5,6,7,8,9],
        'age': [3,3,3,3,2,2,1,1,2,3],
        'sex': [f,f,f,f,f,f,f,m,m,m]}
df = pd.DataFrame(data=data)
df['cut'] = pd.cut(df['age'],[1,2,3,4],labels=['<2','2','>2'],right=False)
pd.pivot_table(df,values='num',index='cut',columns='sex',aggfunc='count',margins=True)

Вывод, опять же с неправильными полями строки (соответствует упорядоченной категории из pd.cut).

sex  female  male  All
cut                   
<2        1     1    5
2         2     1    3
>2        4     1    2
All       7     3   10

Ожидаемый результат будет правильным порядком полей строки.

sex  female  male  All
cut                   
<2        1     1    2
2         2     1    3
>2        4     1    5
All       7     3   10

1 Ответ

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

Вот исправление Для вашего оригинального вопроса .Удалить упорядоченный аргумент из df['age1'] и df['sex1']

Мои изменения:

import pandas as pd
m = 'male'
f = 'female'

data = {'num': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        'age': [1, 2, 2, 3, 3, 3, 3, 1, 2, 3],
        'sex': [f, f, f, f, f, f, f, m, m, m]}
df = pd.DataFrame(data=data)

df['age1'] = pd.Categorical(df['age'], categories=[3, 2, 1])
df['sex1'] = pd.Categorical(df['sex'], categories=[m, f])
pd.pivot_table(df, values='num', index='age1',
               columns='sex1', aggfunc='count', margins=True)

Вывод:

sex  male   female  All
age1            
3     1     4        5
2     1     2        3
1     1     1        2
All   3     7       10

Из документов : Обрабатывается ли этот категориальный как упорядоченный категориальный.Если True, результирующая категоричность будет упорядочена. Упорядоченный категориальный признак, когда сортируется, порядок его атрибутов категорий

Так выглядит, когда вы передаете order = True в pd.Сводная таблица не будет сортировать агрегат по категории, но с переменной появится в вашем фрейме данных.Если вы посмотрите на свой фрейм данных, то женщина идет раньше, чем мужчина, поэтому в таком порядке будет сохранен этот тип для совокупности.

Таким образом, чтобы ответить на ваш вопрос, это предполагаемое поведение упорядоченного, и вы должны быть осторожны, если вы будете сортировать ваш фрейм данных в другом месте вашего скрипта.

...