查找给定横截面的MultiIndex索引

时间:2014-03-25 15:59:18

标签: python pandas

假设我有一个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

我该怎么做?

更新

奇怪的是,即使杰夫的回答对我上面的例子有效,但它与我的真实数据不相符:

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

会正确检索条目!

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

这个怎么样?

grp = df.groupby('B')
output = pd.concat(d for k,d in grp if k in ['two','three'])

输出:

     A      B         C         D
3  bar  three -2.110673 -0.009817
7  foo  three -2.249249  1.396641
2  foo    two -1.531507  2.628120
4  foo    two -0.165092 -0.642685
5  bar    two -0.346419  0.960303