Pandas:获取多级索引级别作为系列

16

我有一个包含多个层级的数据框,例如:

idx = pd.MultiIndex.from_product((['foo', 'bar'], ['one', 'five', 'three' 'four']),
                                 names=['first', 'second'])
df = pd.DataFrame({'A': [np.nan, 12, np.nan, 11, 16, 12, 11, np.nan]}, index=idx).dropna().astype(int)

              A     
first second
foo   five     12
      four     11
bar   one      16
      five     12
      three    11

我想使用索引级别标题为second创建一个新列,以便我得到:

我想创建一个名为second的新列,其数据来自索引级别。

              A    B  
first second
foo   five     12   five
      four     11   four
bar   one      16   one
      five     12   five
      three    11   three

我可以通过重置索引、复制列,然后重新应用来做到这一点,但那似乎更加繁琐。

我尝试过 df.index.levels[1],但它会创建一个排序列表,它不会保留顺序。

如果它是单个索引,我会使用 df.index,但在多索引中,这将创建一个元组列。

如果此问题已在其他地方得到解决,请共享,因为我在搜索stackoverflow存档时没有找到任何解决方法。

3个回答

17
df['B'] = df.index.get_level_values(level=1)  # Zero based indexing.
# df['B'] = df.index.get_level_values(level='second')  # This also works.
>>> df
               A      B
first second           
foo   one     12    one
      two     11    two
bar   one     16    one
      two     12    two
      three   11  three

能否通过索引名称来实现? - A User
1
是的。df.index.get_level_values(level='second') 也可以使用。 - Alexander
1
如果MultiIndex是在列而不是索引上,您可以使用df.columns.get_level_values(level=1)来完成相同的操作。 - Will Bryant

4
df['B'] = idx.to_series().str[1]

0

如果你想用索引名称(而不是数值索引)获取索引列的值,我可以借鉴@AlbertoGarcia-Raboso的回答。

请注意,这样做会得到一个包含索引列的输出结果,它是一个序列,正如问题所要求的那样。一开始看起来可能是重复的列。

df.index.to_frame()['second']

(然后例如用df.index.to_frame()['second'][8]查找第9个系列项目)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接