将熊猫MultiIndex切片后,如何更新其水平?

发布于 2021-01-29 19:31:57

我有一个带有熊猫MultiIndex的数据框:

In [1]: import pandas as pd
In [2]: multi_index = pd.MultiIndex.from_product([['CAN','USA'],['total']],names=['country','sex'])
In [3]: df = pd.DataFrame({'pop':[35,318]},index=multi_index)
In [4]: df
Out[4]:
               pop
country sex
CAN     total   35
USA     total  318

然后,我从该DataFrame中删除一些行:

In [5]: df = df.query('pop > 100')

In [6]: df
Out[6]:
               pop
country sex
USA     total  318

但是当我查询MutliIndex时,它仍然在两个国家都处于其水平。

In [7]: df.index.levels[0]
Out[7]: Index([u'CAN', u'USA'], dtype='object')

我可以用一种很奇怪的方式自己解决这个问题:

In [8]: idx_names = df.index.names

In [9]: df = df.reset_index(drop=False)

In [10]: df = df.set_index(idx_names)

In [11]: df
Out[11]:
               pop
country sex
USA     total  318

In [12]: df.index.levels[0]
Out[12]: Index([u'USA'], dtype='object')

但这似乎很混乱。有什么更好的方法我想念吗?

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是以前咬过我的东西。出于性能和哲学上的考虑,删除列或行不会更改基础MultiIndex,并且正式不将其视为Bug(在此处了解更多信息)。简短的答案是,开发人员说“这不是MultiIndex的目的”。如果修改后需要MultiIndex级别的内容列表,例如用于迭代或检查是否包含某些内容,则可以使用:

    df.index.get_level_values(<levelname>)
    

    这将返回该索引级别内的当前活动值。

    因此,我想这里的“窍门”是API的本机方式是使用get_level_values而不是.index或.columns



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看