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
,Hour
和MW
列。但我想要的是'MW':'Day'
这将产生MW
,Month
和Day
列。
所以我的问题是:是否有可能通过我的数据帧切片并保留列的顺序?或者,我可以排列数据帧,执行我需要的切片,然后将数据框恢复到原始顺序?
在此先感谢。
嘿,这是伟大的,正是我所期待的。但现在我有一个不同的问题。我使用了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
好吧,这显示我想要的顺序:df [df.columns.levels [0] [0]]。columns.tolist()但它不漂亮。有没有更好的方法在数据框中以原始顺序打印第二个标题列? – RainbowSchubert
非常感谢您的支持!这正是我需要的! – RainbowSchubert