Получение нежелательного порядка при сортировке категориальных данных в кадре данных pandas

При сортировке столбцов в кадре данных pandas, которые содержат текст (и, следовательно, имеют тип данных «объект»), работает синтаксис df.sort и сортирует apple, orange, banana в правильном порядке. Однако, если я преобразую столбец фруктов в тип данных Categorical, то попытаюсь отсортировать, это не сработает.

Я хочу отсортировать сначала по столбцу даты и времени, а затем по категориальному столбцу, а затем по некоторым числовым (float/int).

Код (где account не является категориальным) сортируется по month_date, который является объектом даты и времени, и account (A-Z) правильно:

#data['month_name'] = pd.Categorical(data['month_name'],
#           categories=data.month_name.unique().tolist())
#data['account'] = pd.Categorical(data['account'],
#           categories=data.account.unique().tolist())

column_list = data.columns.values.tolist()
sorted_data = data.sort(["month_date","account"], ascending=True)
display(sorted_data)

Пример:

  • Яблоко
  • Банан
  • Морковь

Код (где account является категориальным) неправильно сортируется (обратите внимание, что данные pd.categorical больше не закомментированы):

data['month_name'] = pd.Categorical(data['month_name'],
    categories=data.month_name.unique().tolist())
data['account'] = pd.Categorical(data['account'],
    categories=data.account.unique().tolist())
column_list = data.columns.values.tolist()
sorted_data = data.sort(["month_date","account"], ascending=True)
display(sorted_data)

Пример

  • Яблоко
  • Морковь
  • Банан

person yoshiserry    schedule 04.12.2014    source источник


Ответы (1)


Ваши категории сами по себе не в гарантированном порядке. unique не гарантирует никакого порядка. Они будут в указанном порядке (непонятно, какие значения они имеют в вашем примере)

In [7]: df = DataFrame({'A' : pd.Categorical(list('bbeebbaa'),categories=['e','a','b']), 'B' : np.arange(8) })

In [8]: df
Out[8]: 
   A  B
0  b  0
1  b  1
2  e  2
3  e  3
4  b  4
5  b  5
6  a  6
7  a  7

In [9]: df.dtypes
Out[9]: 
A    category
B       int64
dtype: object

In [10]: df.sort(['A','B'])
Out[10]: 
   A  B
2  e  2
3  e  3
6  a  6
7  a  7
0  b  0
1  b  1
4  b  4
5  b  5

In [11]: df.sort(['A','B'],ascending=False)
Out[11]: 
   A  B
5  b  5
4  b  4
1  b  1
0  b  0
7  a  7
6  a  6
3  e  3
2  e  2
person Jeff    schedule 04.12.2014
comment
Я знаю, что unique() не упорядочивает данные, а просто получает уникальные значения в столбце. Насколько я понимаю, категории должны быть в порядке, определенном моим df.sort, но они не отображаются в этом порядке, когда я отображаю фрейм данных. Month_name, которое также является категориальным, также не отображается в правильном порядке. Я отсортировал по месяцу_дате и ожидал увидеть ось x моего графика морского рождения в порядке: июнь, июль, август, сентябрь, октябрь, но вместо этого я вижу август, июль, июнь, октябрь, сентябрь. - person yoshiserry; 04.12.2014
comment
порядок df будет порядком категорий, который находится в вашем коде, выполненным уникальным, который не имеет определенного порядка - person Jeff; 04.12.2014
comment
Разве dataframe.sort не предназначен для определения порядка данных? мой первоначальный вопрос был, почему это (df.sort) не работает для категориальных данных - person yoshiserry; 04.12.2014
comment
означает ли это, что я должен сделать столбец учетной записи категоричным только после того, как я отсортировал данные в нужном мне порядке? когда я тестирую отображение данных с категориальным типом данных, кажется, что они отображаются так, как они были отсортированы до того, как столбец стал категориальным. - person yoshiserry; 04.12.2014
comment
категориальные элементы будут сортироваться в порядке категорий, поэтому, если вы хотите иметь определенный порядок (по которому я могу затем отсортировать), вам нужно поместить их в этом порядке. - person Jeff; 04.12.2014
comment
Вы говорите, что когда я передаю список категорий команде pd.categorical, этот список уже должен быть в том порядке, в котором я хочу, чтобы категории отображались? Означает ли это, что если я сделаю это, категория month_name также будет отображаться в правильном порядке на гистограммах? - person yoshiserry; 05.12.2014
comment
да откуда еще ему знать, как сортировать категории? в этом суть категорий. Это порядок сортировки. - person Jeff; 05.12.2014