假设我有一个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
我怎样才能做到这一点?
奇怪的是,即使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')
确实正确检索条目!
您可以这样做,但通常我们不使用实际索引(例如整数索引).你的目标是什么?
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')