【问题标题】:DataFrame.index.levels shows "extra" values after paring down dataframeDataFrame.index.levels 在缩减数据帧后显示“额外”值
【发布时间】:2014-08-17 13:18:20
【问题描述】:

假设我有一个大型数据框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')

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    这样做更有效率。

    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)
    

    【讨论】:

    • 我不太确定你是否回答了我的问题。我的目标不是完成从largesmall 的过滤。我上面的small 中只有我想要的数据。我想要的是在small 的 MultiIndex 的第 0 级中获取不同值的列表。 (例如,large 在其 MultiIndex 的 Person 级别中可能有数百个名称,因此当我过滤到仅以 'Jo' 开头的名称时,我可能不知道会得到什么。但是一旦过滤完成,我想看看我得到了什么。你建议我怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2023-03-15
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2020-10-02
    相关资源
    最近更新 更多