Pandas中如何按层级筛选MultiIndex DataFrame的目标行
MultiIndex DataFrame 筛选一级索引下二级条目数大于1的行
样例数据复现
本地测试可先用以下代码构造题目给出的多层索引DataFrame:
import pandas as pd df = pd.DataFrame( {"col": [5624, 1656, 265677, 3755, 47, 85544, 97656, 12774, 111, 9478]}, index=pd.MultiIndex.from_tuples( [("a",1),("a",2),("a",3),("a",4),("b",5),("b",6),("c",7),("d",8),("e",9),("e",10)], names=["L1", "L2"] ) )
最简实现方法
直接按一级索引分组后用filter保留符合行数要求的分组,代码最简洁:
result = df.groupby(level="L1").filter(lambda group: len(group) > 1)
分步实现(方便自定义调整)
如果需要加更复杂的筛选规则,可以拆成两步写,逻辑更直观:
- 先统计每个L1分组下的条目数量,提取符合阈值要求的L1值
# 统计每个L1对应的行数量 l1_count = df.groupby(level="L1").size() # 筛选出条目数大于1的L1值 valid_l1 = l1_count[l1_count > 1].index
- 匹配一级索引在有效列表内的所有行
result = df[df.index.get_level_values("L1").isin(valid_l1)]
结果验证
运行上述代码得到的输出和预期完全一致:
col L1 L2 a 1 5624 2 1656 3 265677 4 3755 b 5 47 6 85544 e 9 111 10 9478
扩展说明
- 若要按其他层级做分组统计,只要把
level参数替换为对应层级的名称/位置序号即可,比如按第二层级L2分组可写level="L2"或level=1 - 若需要调整筛选阈值,直接修改判断条件即可,比如要保留条目数≥3的分组,就把判断条件改为
len(group) >=3
内容的提问来源于stack exchange,提问作者SwiftestKoala
相关产品推荐
相关产品推荐

