假设我有一个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
的索引,其中第二级索引是 two
或three
我该怎么做?
奇怪的是,即使杰夫的回答对我上面的例子有效,但它与我的真实数据不相符:
> 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')
会正确检索条目!
答案 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