2014-11-04 11 views
2

팬더 피벗 기능에 문제가 발생했습니다. 나는 판매 데이터를 월 단위로 피벗하려고합니다. 달 이름을 정렬하려면팬더 피벗 테이블 열을 추가 할 때 알파벳순으로 범주화 된 데이터 정렬 (잘못)

Customer - Sales - Month Name - Year 
a  - 100 - january  - 2013 
a  - 120 - january  - 2014 
b  - 220 - january  - 2013 

이 제대로 나는 범주 데이터로 월 이름을 가진 열을 추가 한 다음과 같이 데이터 세트입니다. 나는이 기능을 사용하면

dataset['Month'] = dataset['Month Name'].astype('category') 
dataset['Month'].cat.set_categories(['January', 'February', 'March', 'April', 'May', 'June',  'July', 'August', 'September', 'October', 'November', 'December'],inplace=True) 
dataset.pop('Month Name') 

는 :

pt = dataset.pivot_table(values="Sales", index="Month") 

를 내가 년 개월에 걸쳐 회동 때

Month 
January  3620302.79 
February  3775507.25 
March  4543839.69 

그러나 달은 알파벳 순으로 정렬됩니다 예상 된 결과를 얻을.

print dataset.pivot_table(values='Sales', index="Month", columns="Year", aggfunc="sum") 
Year   2011  2012  2013  2014 
Month             
April  833692.19 954483.28 1210847.85 1210926.61 
August  722604.75 735078.52 879905.23 1207211.00 
December 779873.51 1053441.71 1243745.73   NaN 

마지막 코드 샘플에서 월 이름을 올바르게 정렬하는 데 도움이되는데 도움을 주시면 감사하겠습니다.

감사합니다,

프랭크

+0

따라서, 결과 인덱스'object'' DTYPE가된다 (그것을 M 불림) 다른 칼럼 [ '달'] 및 datetime로 변환 한 다음처럼 pivot_table 여러 인덱스 세트 피벗 및 c에 따라 재정렬되지 않습니다. ategory. 그래서 그것은 버그입니다. pandas는 CategoricalIndex를 아직 지원하지 않습니다. 이상적인 결과입니다. 다음은 버그 보고서입니다. https://github.com/pydata/pandas/issues/8731 – Jeff

+0

@Frank, 답변을 제공해 주셨습니다. 아직 검토하지 않았습니까? – Anzel

+0

범주 형 열과 함께 pivot_table을 사용하는 경우 비슷한 문제가 발생하고 범주에 DataFrame 값이 없습니다. pandas sais NA를 정수로 변환 할 수 없습니다. – Diego

답변

0

당신은 따라서 일종의 알파벳 '월'을 인덱싱 것 바로 pivot_table 후입니다. 다행히도 dataset['Month']pandas.datetime으로 변환하고 pivot_table 님의 Reindex 이후에 문자열로 다시 변환 할 수 있습니다.

하지 최고의 솔루션,하지만이 트릭 (나는 어떤 임의의 인형을 사용) 수행해야합니다

import pandas as pd 
... 
# convert dataset['Month'] to pandas.datetime by the time of pivot 
# it will reindex by datetime hence the sort order is kept 
pivoted = dataset.pivot_table(index=pd.to_datetime(dataset['Month']), columns='Year', \ 
           values='Sales', aggfunc='sum') 
pivoted 
Year  2012 2013 2014 
Month      
2014-01-04 151 295 NaN 
2014-02-04 279 128 NaN 
2014-03-04 218 244 NaN 
2014-04-04 274 152 NaN 
2014-05-04 276 NaN 138 
2014-06-04 223 NaN 209 
... 

# then re-set the index back to Month string, "%B" means month string "January" etc. 
pivoted.index = [pd.datetime.strftime(m, format='%B') for m in pivoted.index] 

pivoted 
Year  2012 2013 2014 
January  151 295 NaN 
February 279 128 NaN 
March  218 244 NaN 
April  274 152 NaN 
May   276 NaN 138 
June  223 NaN 209 
... 

그러나 당신이 것을 필요로하는 경우, 당신은 데이터 집합을 복사 할 수 있으며, '월'인덱스 라벨을 놓칠 것 그 의해 자동 환산

dataset.pivot_table(index=['M', 'Month'], ...) 
+0

날짜가 아닌 경우 어떻게해야합니까? pivot_table 후에 인덱스의 원래 순서는 어떻게 유지합니까? – Cesar

+0

@Cesar, 날짜가 아닌 경우 '{'one ': 1,'two ': 2,'three ': 3, ...}'과 같은 순서를 매핑하는 맞춤 사전을 가질 수 있습니다. * 정렬 *에 대한 색인에 색인을 맵핑 한 다음 의미가있는 키로 다시 맵핑하십시오. 그것이 그대로, 더 나은 해결책은 분명하지만 OP가 요구 한 것과 맞습니다. – Anzel