繁体   English   中英

Select 行在 pandas MultiIndex DataFrame 通过给几个(但不是所有)级别的值

[英]Select rows in pandas MultiIndex DataFrame by giving values for several (but not all) levels

m_index = pd.MultiIndex.from_product([['a', 'b', 'c'], [1, 2, 3], [0.1, 0.2, 0.3]])
test_df = pd.DataFrame(np.arange(27), m_index)

我想找到前两个索引级别在某个值列表中的所有行,例如[('a', 1), ('b', 2), ('c', 1), ('c', 3)]

这可能吗?

您可以在索引上使用droplevel然后调用isin

keys = [('a', 1), ('b', 2), ('c', 1), ('c', 3)]
# -1 drops the last level, so we're checking the first two only
test_df[test_df.index.droplevel(-1).isin(keys)]

          0
a 1 0.1   0
    0.2   1
    0.3   2
b 2 0.1  12
    0.2  13
    0.3  14
c 1 0.1  18
    0.2  19
    0.3  20
  3 0.1  24
    0.2  25
    0.3  26

使用DataFrame.reset_indexIndex.isin并在boolean indexing中过滤:

L = [('a', 1), ('b', 2), ('c', 1), ('c', 3)]

df = test_df[test_df.reset_index(level=2).index.isin(L)]
print (df)
          0
a 1 0.1   0
    0.2   1
    0.3   2
b 2 0.1  12
    0.2  13
    0.3  14
c 1 0.1  18
    0.2  19
    0.3  20
  3 0.1  24
    0.2  25
    0.3  26
    

没有索引操作的解决方案也是可能的。 只需将索引级别 0 和 1 的压缩元组与所需列表匹配即可。

test_df[list(map(lambda el: el in [('a', 1), ('b', 2), ('c', 1), ('c', 3)],
                 zip(test_df.index.get_level_values(0),
                     test_df.index.get_level_values(1))))]

          0
a 1 0.1   0
    0.2   1
    0.3   2
b 2 0.1  12
    0.2  13
    0.3  14
c 1 0.1  18
    0.2  19
    0.3  20
  3 0.1  24
    0.2  25
    0.3  26

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM