当前位置:  开发笔记 > 编程语言 > 正文

查找给定横截面的MultiIndex索引

如何解决《查找给定横截面的MultiIndex索引》经验,为你挑选了1个好方法。

假设我有一个MultiIndex DataFrame:

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                          'foo', 'bar', 'foo', 'foo'],  
                   'B' : ['one', 'one', 'two', 'three',
                          'two', 'two', 'one', 'three'],
                   'C' : randn(8), 'D' : randn(8)})

df = df.set_index(['A', 'B']).sort_index()
                  C         D
A   B                        
bar one    0.052069 -0.541728
    three -1.703340  0.369047
    two   -0.221340  1.281790
foo one    0.219942  0.093917
    one   -2.531077  0.445473
    three  0.243135 -1.730576
    two   -1.464053  1.241126
    two   -0.846171 -1.444660

我想检索索引df,其中第二级指标twothree

我怎样才能做到这一点?

更新

奇怪的是,即使Jeff的答案适用于我上面的例子,它也不适用于我的真实数据:

> cfs_rates.index.get_level_values('B')
Out: Index([u'oXliPbXGWx', u'oXliPbXGWx', u'oXZR1VqRIH', u'oXZR1VqRIH', u'oXUMJNEcAm', u'oXUMJNEcAm', u'oXrC6luflN', u'oXrC6luflN', u'oXACDVffiH', u'oXACDVffiH', u'oXACDVffiH', u'oXMRMtC2lS', u'oXMRMtC2lS', u'oX0S45QSwf', u'oXkZVG9UEV', u'oXqs51fyxc', u'oXuLgFLVJR', u'oXiU9xrYbc', u'oXiU9xrYbc', u'oXiU9xrYbc', u'oX7rgkbLNN', u'oX7rgkbLNN', u'oXLoIyg0yU', u'oXLoIyg0yU', u'oXKcAKwKck', u'oXKcAKwKck', u'oX6EN5aKhZ', u'oX6EN5aKhZ', u'oXFyCRPD5D', u'oXFyCRPD5D', u'oXITpFj1sg', u'oXITpFj1sg', u'oXQUn2dSZ3', u'oXQUn2dSZ3', u'oXTALtx9yg', u'oXaLPOroxI', u'oXAxkDpC1q', u'oXCylQYlOG', u'oXVVE8zpgZ', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXGBjTephd', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', u'oXpOOA612p', ...], dtype='object')                                                                                                             

> df.index.get_level_values('B').unique()
Out: array(['oXliPbXGWx', 'oXZR1VqRIH', 'oXUMJNEcAm', 'oXrC6luflN',
       'oXACDVffiH', 'oXMRMtC2lS', 'oX0S45QSwf', 'oXkZVG9UEV',
       'oXqs51fyxc', 'oXuLgFLVJR', 'oXiU9xrYbc', 'oX7rgkbLNN',
       'oXLoIyg0yU', 'oXKcAKwKck', 'oX6EN5aKhZ', 'oXFyCRPD5D',
       'oXITpFj1sg', 'oXQUn2dSZ3', 'oXTALtx9yg', 'oXaLPOroxI',
       'oXAxkDpC1q', 'oXCylQYlOG', 'oXVVE8zpgZ', 'oXGBjTephd',
       'oXpOOA612p', 'oX5xyjSEFu', 'oXNwnfODmx', 'oXc8Ef8RKp',
       'oXhSJGS9Vt', 'oX77EAPM90', 'oXJKFMxpGM', 'oXM2A7Ovs4',
       'oXMBaAdS6P', 'oXXd1TFOds', 'oXgYwsBEeU', 'oXhg0Z4v70',
       'oXmHmreVWq', 'oXpoPZHbcL', 'oXyn2Vy5Ds', 'oXLnKg7f0H',
       'oXG3N1BGRa', 'oXFgSNVf7X', 'oXSsJ9RQHM', 'oXQEX8u59U',
       'oXfn4xmkVR', 'oXirJeA6KV', 'oXTnLZFeoD', 'oXDjBE1tFg',
       'oXldRy7GrP', 'oXHtACeymW', 'oXTLupWtgO', 'oXZXJUUeUT',
       'oX6NjO05Ty', 'oXTNJtiaQH', 'oXX3eZpIT3', 'oXhPkfjnXY',
       'oXRNaqcssj', 'oXAe1bhLMy', 'oX0Yza7hgx', 'oXyG1ZiLFU',
       'oXd8fKbi5l', 'oXDNPZtUhk', 'oXml3RS3Z2', 'oX1X1ml8m3',
       'oXtRvKMbnu', 'oXh0xGRkfR', 'oXm2HJOqUT', 'oXqw4GB40Q',
       'oX5Q9UXh7V', 'oXMO23wBzX'], dtype=object)

> df.index.get_level_values('B').isin('oX6NjO05Ty').any()
Out: False

请注意,然而oX6NjO05Ty就是那里(它在unique上面的一个条目中).实际上,这句话

entries = cfs_df.xs(`oX6NjO05Ty`, level='B')

确实正确检索条目!



1> Jeff..:

您可以这样做,但通常我们不使用实际索引(例如整数索引).你的目标是什么?

In [10]: df[df.index.get_level_values('B').isin(['two','three'])]
Out[10]: 
                  C         D
A   B                        
bar three  2.198031  0.329089
    two   -0.351223  2.271017
foo three  0.165734  1.638998
    two   -0.481800  0.379457
    two    1.658409 -0.390166

[5 rows x 2 columns]

In [11]: df.reset_index()[df.index.get_level_values('B').isin(['two','three'])]
Out[11]: 
     A      B         C         D
1  bar  three  2.198031  0.329089
2  bar    two -0.351223  2.271017
5  foo  three  0.165734  1.638998
6  foo    two -0.481800  0.379457
7  foo    two  1.658409 -0.390166

[5 rows x 4 columns]

In [12]: df.reset_index()[df.index.get_level_values('B').isin(['two','three'])].index
Out[12]: Int64Index([1, 2, 5, 6, 7], dtype='int64')

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有