[英]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)]
这可能吗?
使用DataFrame.reset_index
和Index.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.