2015-06-10 4 views
1

У меня есть кадр данных, который является результатом работы группы с использованием категориальной переменной, созданной pd.cut.pandas: как отсортировать результаты groupby с использованием категориальной переменной pd.cut

import pandas as pd 
import numpy as np 

di = pd.DataFrame({'earnings':pd.np.random.choice(10000, 10000), 'counts':[1] * 10000}) 
brackets=append(np.arange(0,5001,500),100000000) 
di['earncat']=pd.cut(di['earnings'], brackets,right=False,retbins=True)[0] 

di_everyone=di.groupby('earncat').sum()[['counts']] 
di_everyone.sort_index(inplace=True) 
di_everyone.to_string 

И это выход,

[0, 500)   83,005,823 
[1000, 1500)  11,995,255 
[1500, 2000)  13,943,052 
[2000, 2500)  11,967,696 
[2500, 3000)  10,741,178 
[3000, 3500)  9,749,914 
[3500, 4000)  6,833,928 
[4000, 4500)  7,150,125 
[4500, 5000)  4,655,773 
[500, 1000)  9,718,753 
[5000, 100000000) 26,588,622 

Я не знаю, почему на второй в последней строке появится [500, 1000). Я решил не называть «заработок», потому что хочу увидеть разбивку. Как я могу сортировать на заработке?

Заранее спасибо

+0

Какую версию панд вы используете? Начиная с 0.16.1, существует поддержка категориальных переменных в индексе, которые будут правильно сортировать – joris

+0

Ваш индекс преобразуется в строки перед их сортировкой. df_everyone.index показывает Index ([u '[0, 500) », ... Таким образом, он сортируется по заработку. Просто не так, как ты этого хочешь. – firelynx

ответ

0

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

В то же время, вы можете работать вокруг проблемы вроде этого:

di['earnlower'] = di['earncat'].apply(lambda x: int(x[1:].split(',')[0])) 
di['earnhigher'] = di['earncat'].apply(lambda x: int(x[:-2].split(',')[1])) 

di_everyone=di.groupby(['earnlower', 'earnhigher']).sum()[['counts']] 
+0

Спасибо! Я загрузил последние панды и исправил проблему. – chungkim271

Смежные вопросы