我创建了一个包含三级多索引(组,产品和状态)的数据透视表。状态级别按字母顺序自动排序,但我需要将排序更改为自定义的非字母顺序。我可能还需要以类似的方式重新订购集团和产品级别。
pivot = data.pivot_table(rows=['Group', 'Product', 'State'],
values = ['JAN', 'FEB', 'MAR', 'APR', 'MAY',
'JUN', 'JUL', 'AUG', 'SEP', 'OCT',
'NOV', 'DEC'], fill_value=0, margins=True aggfunc=sum)
cols = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
#I used this method to prevent the month names from being alphabetically sorted
pivot = pivot[cols]
数据透视表的一部分看起来像这样......
JUN JUL AUG
Group Product State
Group A Product A AZ 0 0 0
CO 0 0 0
GA 0 0 0
IL 0 0 0
IN 0 0 0
KS 0 0 0
MN 0 0 0
MO 0 0 0
我需要状态的顺序如下......
state_order = ['AZ','CO','ID','NV','OR','UT','WA','IA','KS','MN','MO','NE','ND','SD','GA','IL','IN','OH','WI']
我尝试了reindex_axis()函数,在上面的列表中输入并指定level = 2。但是,州仍然按字母顺序排序。
非常感谢对修复的任何见解。
答案 0 :(得分:2)
您可以尝试将State的数据类型更改为category。
data["state"] = data["state"].astype("category")
然后设置排序顺序
data["state"].cat.set_categories(['AZ','CO','ID','NV','OR','UT','WA','IA','KS',
'MN','MO','NE','ND','SD','GA','IL','IN','OH','WI'],inplace=True)
编辑:fyi,类别dtype相对较新。 0.15.0我相信
答案 1 :(得分:0)
我被一个类似的问题所困扰,我将发布一个示例解决方案。 您可以使用虚拟变量和groupby。
import pandas as pd
import numpy as np
index = pd.MultiIndex.from_tuples(zip(['a', 'a', 'a', 'b', 'b', 'b'],
[0, 0, 0, 1, 1, 1],
['x', 'xx', 'xxx', 'x', 'xx', 'xxx']),
names=['A', 'B', 'C'])
df = pd.DataFrame(np.random.rand(6, 3), index = index)
>>> df
0 1 2
A B C
a 0 x 0.839870 0.763803 0.847632
xx 0.619066 0.715492 0.467518
xxx 0.917468 0.923521 0.278665
b 1 x 0.660889 0.209247 0.502107
xx 0.069925 0.889308 0.836755
xxx 0.967187 0.650482 0.138759
desired_order = ['xxx', 'xx', 'x']
df = df.reset_index(2)
mapping = { _ : desired_order.index(_) for _ in df['C'] }
df['Dummy'] = df['C'].map(lambda x: mapping[x]) #gives desired order
df = df.groupby(level=['A', 'B']).apply(lambda x: x.sort('Dummy'))
df.drop('Dummy', axis=1)
>>> df
C 0 1 2
A B
a 0 xxx 0.273731 0.561262 0.970034
0 xx 0.859063 0.459765 0.921475
0 x 0.640554 0.045410 0.512320
b 1 xxx 0.678473 0.380712 0.252676
1 xx 0.501426 0.577250 0.317702
1 x 0.586227 0.927453 0.794912
使用pandas 0.15中引入的分类变量可能有更好的方法,但我不知道更简单的解决方案。