2016-03-20 16 views
2

我试图获得切片的句柄。我有以下数据框,df:在Python中使用自定义排序切分多索引头数据框

Feeder # 1        Feeder # 2 
    TimeStamp MW  Month Day Hour TimeStamp  MW  Month  Day Hour 
0 2/3   1.2 1  30 22  2/3   2.4 1   30  22 
1 2/4   2.3 1  31 23  2/3   4.1 1   31  23 
2 2/5   3.4 2  1  0   2/3   3.7 2   1  0 

总共有8个馈线。

如果我想在所有的馈线选择所有兆瓦的专栏中,我可以这样做:

df.xs('MW', level=1, axis=1,drop_level=False) 

如果我想给料机2到4,我可以这样做:

df.loc[:,'Feeder #2':'Feeder #4'] 

但如果我想通过馈线2到4中的天通过列数MW通过:

df.loc[:,pd.IndexSlice['Feeder #2':'Feeder #4','MW':'Day']] 

我得到以下错误。

MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (1) 

所以,如果我排序的数据帧,那么我就能够做到:

df.sortlevel(level=0,axis=1).loc[:,pd.IndexSlice['Feeder #2':'Feeder #4','Day':'MW']] 

但排序数据帧摧毁1级在header--一切原来的顺序按字母顺序排列得到(lexsorted在Python中说?)。我的期望内容混乱:'Day':'MW'产生Day,HourMW列。但我想要的是'MW':'Day'这将产生MWMonthDay列。

所以我的问题是:是否有可能通过我的数据帧切片并保留列的顺序?或者,我可以排列数据帧,执行我需要的切片,然后将数据框恢复到原始顺序?

在此先感谢。

回答

0

我认为你可以使用CategoricalIndex保持顺序:

import pandas as pd 
import numpy as np 

level0 = "Feeder#1 Feeder#2 Feeder#3 Feeder#4".split() 
level1 = "TimeStamp MW  Month Day Hour".split() 

idx0 = pd.CategoricalIndex(level0, level0, ordered=True) 
idx1 = pd.CategoricalIndex(level1, level1, ordered=True) 

columns = pd.MultiIndex.from_product([idx0, idx1]) 

df = pd.DataFrame(np.random.randint(0, 10, (10, 20)), columns=columns) 

然后,你可以这样做:

df.loc[:, pd.IndexSlice["Feeder#2":"Feeder#3", "MW":"Day"]] 

编辑

的电平转换为CategoricalIndex

columns = df.columns 
for i in range(columns.nlevels): 
    level = pd.unique(columns.get_level_values(i)) 
    cidx = pd.CategoricalIndex(level, level, sorted=True) 
    print(cidx) 
+0

嘿,这是伟大的,正是我所期待的。但现在我有一个不同的问题。我使用了level0 = pd.CategoricalIndex(df.columns.levels [0],ordered = True)和level1 = pd.CategoricalIndex(df.columns.levels [0],ordered =真正)。即使多索引中第二级的顺序是** TimeStamp **,** MW **等,df.columns.levels [0]也会自动按顺序排列顺序。有没有办法调用.column方法并保留原始顺序? – RainbowSchubert

+0

好吧,这显示我想要的顺序:df [df.columns.levels [0] [0]]。columns.tolist()但它不漂亮。有没有更好的方法在数据框中以原始顺序打印第二个标题列? – RainbowSchubert

+0

非常感谢您的支持!这正是我需要的! – RainbowSchubert

相关问题