当前位置: 首页 > 面试题库 >

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

郭博涉
2023-03-14
问题内容

我有一个带有熊猫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='html" target="_blank">object')

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


问题答案:

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

df.index.get_level_values(<levelname>)

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

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



 类似资料:
  • 问题内容: 我有3个级别的MultiIndex的熊猫数据框。我试图根据与两个级别相对应的值列表来提取此数据框的行。 我有这样的事情: 现在,我要获取索引级别为“ b”和“ c”的所有行: 即值的具有或在水平和分别为:。 所以我想在第一级上学习一个,并在第二级和第三级上提取特定的元组。 最初,我认为将多索引对象传递给.loc会拉出我想要的值/级别,但这是行不通的。做这样的事情的最好方法是什么? 问题

  • 问题内容: 我有一个类似MultiIndex的系列: 我想获得s [‘b’]值,其中第二个索引(’ ‘)在2到10之间。 在第一个索引上切片可以正常工作: 但不是第二种,至少从似乎是两种最明显的方式来看: 1)这将返回元素1至4,与索引值无关 但是,如果我反转索引,并且第一个索引是整数,第二个索引是字符串,则可以正常工作: 问题答案: 正如Robbie-Clarken回答的那样,从0.14开始,您

  • 问题内容: 我试图选择一个数据框的子集的一个子集,仅选择一些列,并在行上进行过滤。 但是,我得到了错误: 现在切片和过滤的正确方法是什么? 问题答案: 这是引入的更改,并在文档中进行了详细说明- 以前,选择带有标签列表的地方总是可以成功的,其中缺少一个或多个标签将返回成功。现在将显示一个。将来这将提出 (GH15747)。当传递带有至少1个缺失标签的标签列表时,此警告将在或 上触发以使用或。 例如

  • 问题内容: 为什么在多索引DataFrame时不能使用偏移量? 例如,使用: 如果我尝试使用偏移量进行分组和滚动,则会显示“ ValueError:窗口必须为整数 ”: 并不是说以下这些变体可以满足我的需求,但是请注意对作品进行分组和滚动: 我可以在DataFrame的单索引子集上使用偏移量滚动: 如果确实不可能在多索引DataFrame上进行偏移滚动,那么将零应用于每个0级索引项的最有效的解决方

  • 问题内容: 代码示例: 现在,我要检索A值: Q1 :在[3.3,6.6]范围内- 预期的返回值:[3.3,5.5,6.6]或[3.3,3.3,5.5,6.6](如果包括最后一个值),以及[3.3,5.5] ]或[3.3、3.3、5.5](如果没有)。 Q2 :在[2.0,4.0]范围内-预期返回值:[3.3]或[3.3,3.3] 与任何其他 MultiIndex 维度相同,例如B值: Q3 :在

  • 我正在使用从h5文件加载的调查数据作为通过熊猫包。在此中,所有行都是单个调查的结果,而列是单个调查中所有问题的答案。 我的目标是将此数据集缩减为更小的,仅包括在某个问题上具有某个描述答案的行,即在本列中具有相同的值。我能够确定具有此条件的所有行的索引值,但我找不到如何删除这些行或仅使用这些行创建新的df。