为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我在多索引的索引中有空项

为什么我在多索引的索引中有空项

炎炎设计 2023-04-18 16:03:51
这只是为多索引数据帧的初学者分享一个非常基本的概念。我注意到 2 索引(多索引)df 的索引列中有空项。虽然这一定是多索引数据帧的基础知识,但我不熟悉它并且忘记了它。我没有很快注意到这可能的意义,因为我有非常大的数字作为索引值,您甚至没有开始检查它们的重要性。排序df.sort_index(inplace=True)也无助于摆脱空项目。乍一看,数据集本身的第一个索引似乎有部分空行。搜索“多索引的空项目”也无济于事。这就是为什么我想与其他多索引数据帧的初学者分享这个非常简单的问题。以下是索引列“A_idx”中的“空项”:A_idx B_idx12344 12345   0.289163 -0.464633 -0.060487      12345   0.224442  0.177609  2.15643612346 12346  -0.262329 -0.248384  0.92558012347 12347   0.051350  0.452014  0.206809      12348   2.757255 -0.739196  0.183735      12349  -0.064909 -0.963130  1.36477112350 12351  -1.330857  1.881588 -0.262170
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

这只是为多索引数据帧的初学者分享一个非常基本的概念。

“空”项是多索引视图的一部分,仅在您输出 df 时出现,它有助于您理解层次结构。如果您输出隔离的 Multiindex 类,则没有项目是空的。因此,索引项永远不会真正为空,并且“空”字段仅出现在 df 输出中:

  • 如果“A_idx”索引被分配给多个“B_idx”索引值,则“A_idx”索引不会重复,因为它是 parent

  • 如果“A_idx”索引指向多个值行,而“B_idx”索引正在重复,B_idx仍然重复,因为它是 child

如果您使用df.head(10)并发现“空”索引项在第 1 行,您也可以在 df 中使用 快速检查df.iloc[1].reset_index()。您会看到索引项不为空。

在下文中,“first”和“second”是索引名称,因为它们在同一输出行上,所以看起来具有同等的父级权利,但实际上层次结构是从左到右的。

first second

bar   one     0.289163 -0.464633 -0.060487

      two     0.224442  0.177609  2.156436

baz   one    -0.262329 -0.248384  0.925580

foo   one     0.051350  0.452014  0.206809

      two     2.757255 -0.739196  0.183735

      three  -0.064909 -0.963130  1.364771

qux   one    -1.330857  1.881588 -0.262170

感谢您提供示例,请转到Access last elements of inner multiindex level in pandas dataframe。


这实际上意味着:


first second

bar   one     0.289163 -0.464633 -0.060487

bar   two     0.224442  0.177609  2.156436

baz   one    -0.262329 -0.248384  0.925580

foo   one     0.051350  0.452014  0.206809

foo   two     2.757255 -0.739196  0.183735

foo   three  -0.064909 -0.963130  1.364771

qux   one    -1.330857  1.881588 -0.262170

####


如何相应地创建层次结构的示例。


传递给 set_index() 的列列表的顺序以相同的顺序创建层次结构。


您可以在我从pandas multiindex reindex by rows借用的一个小示例中查看这一点,其中 df2 覆盖了两个索引的切换。只有 df 显示秘密“空项目”,请参阅df与df2输出:


df = pd.DataFrame({'month': [1, 4, 7, 10],

                'year': [2012, 2012, 2013, 2013],

                'sale': [55, 40, 84, 31]})

df2 = df.copy()


df=df.set_index(['year','month'])

df2=df2.set_index(['month','year'])

df:


            sale

year month      

2012 1        55

     4        40

2013 7        84

     10       31

df2:


   month  year  sale

0      1  2012    55

1      4  2012    40

2      7  2013    84

3     10  2013    31


df.index

输出:


MultiIndex([(2012,  1),

            (2012,  4),

            (2013,  7),

            (2013, 10)],

           names=['year', 'month'])

或者:


df2.index

输出:


MultiIndex([( 1, 2012),

            ( 4, 2012),

            ( 7, 2013),

            (10, 2013)],

           names=['month', 'year'])

看看 df 中的级别:


df.index.levels[0]

Int64Index([2012, 2013], dtype='int64', name='year')


df.index.levels[1]

Int64Index([1, 4, 7, 10], dtype='int64', name='月')


df2.index.levels[0]

Int64Index([1, 4, 7, 10], dtype='int64', name='月')


df2.index.levels[1]

Int64Index([2012, 2013], dtype='int64', name='year')


如果要检查或阐明输出视图中层次结构的不同级别,请选择一行并重置索引:


df.iloc[1].reset_index()

输出:


  index 2012

           4

0  sale   40

或者:


df2.iloc[1].reset_index()

输出:


  index    4

        2012

0  sale   40


查看完整回答
反对 回复 2023-04-18
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信