[英]Roll levels of a MultiIndex
假设我有一个数据框,其中我的列是MultiIndex
col = pd.MultiIndex.from_product(
[[1, 2], ['A', 'B'], ['First', 'Second']],
names=['Cat', 'Dog', 'Bird']
)
dat = np.arange(16).reshape(2, -1)
df = pd.DataFrame(dat, columns=col)
df
Cat 1 2
Dog A B A B
Bird First Second First Second First Second First Second
0 0 1 2 3 4 5 6 7
1 8 9 10 11 12 13 14 15
我想调整列,以使“ Bird
级别位于顶部,“ Cat
级别向下移至中间,而“ Dog
位于底部。
可以连续使用swaplevel
,但是在中间增加整个数据swaplevel
只是为了增加列而感到笨拙。
df.swaplevel(0, 2, 1).swaplevel(1, 2, 1).sort_index(1)
Bird First Second
Cat 1 2 1 2
Dog A B A B A B A B
0 0 2 4 6 1 3 5 7
1 8 10 12 14 9 11 13 15
创建新的MultiIndex
应该是有效的,但不是那么直观,并且可能不必要地冗长。
def roll(x):
return x[-1:] + x[:-1]
df.set_axis(
pd.MultiIndex.from_tuples(
[roll(x) for x in df.columns.values],
names=roll(df.columns.names)
), axis=1, inplace=False).sort_index(1)
Bird First Second
Cat 1 2 1 2
Dog A B A B A B A B
0 0 2 4 6 1 3 5 7
1 8 10 12 14 9 11 13 15
有没有一种干净直观的方法来执行此操作,而无需在中间创建中间数据框?
先生,这是您需要的吗? 使用reorder_levels
:
df.reorder_levels(['Bird','Cat','Dog'],axis=1).sort_index(level=0,axis=1)
Out[396]:
Bird First Second
Cat 1 2 1 2
Dog A B A B A B A B
0 0 2 4 6 1 3 5 7
1 8 10 12 14 9 11 13 15
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.