Python DataFrame.index.levels显示“;额外的;减少数据帧后的值

Python DataFrame.index.levels显示“;额外的;减少数据帧后的值,python,pandas,multi-index,Python,Pandas,Multi Index,假设我有一个大数据帧large,它在行上有一个多索引。我通过只选择一些行来缩减这个数据帧,并将结果分配给small。特别是,small在行的多索引的第0级中的不同值少于large 然后,我希望在small行的多索引的第0级中有一个不同值的列表,因此我调用small.index.levels[0]。结果很奇怪:它返回与large.index.levels[0]相同的内容,尽管实际上应该有更少的值 发生什么事了 MWE: 输出: Index([u'Alex', u'John', u'Josh'],

假设我有一个大数据帧
large
,它在行上有一个多索引。我通过只选择一些行来缩减这个数据帧,并将结果分配给
small
。特别是,
small
在行的多索引的第0级中的不同值少于
large

然后,我希望在
small
行的多索引的第0级中有一个不同值的列表,因此我调用
small.index.levels[0]
。结果很奇怪:它返回与
large.index.levels[0]
相同的内容,尽管实际上应该有更少的值

发生什么事了

MWE:

输出:

Index([u'Alex', u'John', u'Josh'], dtype='object')
Index([u'Alex', u'John', u'Josh'], dtype='object')
预期产出:

Index([u'John', u'Josh'], dtype='object')
Index([u'Alex', u'John', u'Josh'], dtype='object')

这样做效率更高

In [43]: large[large.index.get_level_values('Person').to_series().str.startswith('Jo').values]
Out[43]: 
                    one       two
Person Letter                    
John   a       1.764052  0.400157
       b       0.978738  2.240893
       c       1.867558 -0.977278
       d       0.950088 -0.151357
       e      -0.103219  0.410599
Josh   a       0.144044  1.454274
       b       0.761038  0.121675
       c       0.443863  0.333674
       d       1.494079 -0.205158
       e       0.313068 -0.854096
回答你的问题。这是一个实现细节。使用
.get_level_values()
(而不是访问内部
.levels

如果你愿意,你可以这样做

In [13]: small.index.get_level_values('Person').unique()
Out[13]: array(['John', 'Josh'], dtype=object)

In [14]: large.index.get_level_values('Person').unique()
Out[14]: array(['John', 'Josh', 'Alex'], dtype=object)

我不太确定你是否回答了我的问题。我的目标不是完成从
large
small
的过滤。上面我的
small
中只有我想要的数据。我想要的是得到
small
多索引第0级的不同值列表。(例如,
large
在其多索引的
Person
级别中可能有数百个姓名,因此当我只筛选到以
'Jo'
开头的姓名时,我可能不知道我将得到什么。但一旦筛选完成,我想看看我得到了什么。你建议我怎么做?
In [13]: small.index.get_level_values('Person').unique()
Out[13]: array(['John', 'Josh'], dtype=object)

In [14]: large.index.get_level_values('Person').unique()
Out[14]: array(['John', 'Josh', 'Alex'], dtype=object)