削减数据帧后,DataFrame.index.levels显示“额外”值

时间:2014-06-26 15:36:46

标签: python pandas multi-index

我们假设我有一个大型数据框large,其行上有一个MultiIndex。我通过仅选择部分行并将结果分配给small来减少此数据帧。特别是,small在行的MultiIndex的第0级中具有比large更少的不同值。

然后,我想在small行的MultiIndex的第0级别中列出不同的值,因此我调用small.index.levels[0]。结果很奇怪:它返回与large.index.levels[0]相同的东西,尽管事实上应该有更少的值。

发生了什么?

MWE:

import pandas as pd
import numpy as np

np.random.seed(0)

idx = pd.MultiIndex.from_product([['John', 'Josh', 'Alex'], list('abcde')], 
                                 names=['Person', 'Letter'])
large = pd.DataFrame(data=np.random.randn(15, 2), 
                     index=idx, 
                     columns=['one', 'two'])
small = large.loc[['Jo'==d[0:2] for d in large.index.get_level_values('Person')]]

print small.index.levels[0]
print large.index.levels[0]

输出:

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')

1 个答案:

答案 0 :(得分:2)

更有效率。

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)