基于层级计数筛选Pandas MultiIndex DataFrame:选取col1对应col2含2个标签的行
解决Pandas MultiIndex筛选问题:找出col1在col2维度下恰好有两个标签的行
嘿,这个需求挺常见的,我来给你一步步拆解实现方法,附上可直接测试的代码示例,你可以照着来调整~
核心思路
我们需要先定位出每个col1对应的col2标签数量恰好为2的那些col1值,再用这些值去过滤原DataFrame,就能得到目标行。
步骤1:构造示例数据(方便你验证效果)
先模拟一个带MultiIndex的DataFrame,还原你的数据场景:
import pandas as pd data = {'value': [10, 20, 30, 40, 50, 60]} # MultiIndex设置:col1包含A、B、C,其中A和C各对应2个col2标签,B只有1个 index = pd.MultiIndex.from_tuples( [('A', 'X'), ('A', 'Y'), ('B', 'X'), ('C', 'X'), ('C', 'Y'), ('C', 'Y')], names=['col1', 'col2'] ) df = pd.DataFrame(data, index=index)
步骤2:统计每个col1对应的col2标签数量
这里分两种场景处理:
- 如果同一个col1下的col2没有重复标签,直接用
size()统计行数即可(每行对应一个唯一col2标签):# 按col1分组,统计每组的行数(即col2标签数量) col1_counts = df.groupby(level='col1').size() - 如果同一个col1下的col2可能有重复标签,需要用
nunique()统计唯一标签数:# 按col1分组,统计每组col2的唯一标签数量 col1_counts = df.groupby(level='col1')['col2'].nunique()
步骤3:筛选出符合条件的col1
从统计结果中挑出标签数量恰好为2的col1:
target_col1 = col1_counts[col1_counts == 2].index
步骤4:过滤原DataFrame得到结果
用isin()方法匹配目标col1,就能得到想要的行:
# 方法1:通过索引层级筛选 result = df[df.index.get_level_values('col1').isin(target_col1)] # 方法2:用query语法更简洁直观 result = df.query('col1 in @target_col1')
运行后,结果会包含col1为A和C的所有行(因为它们的col2标签数都是2)。
补充小技巧
要是想简化代码,也可以把统计和筛选合并成一行:
result = df[df.index.get_level_values('col1').isin( df.groupby(level='col1').size()[lambda x: x == 2].index )]
内容的提问来源于stack exchange,提问作者user6429576
相关产品推荐
相关产品推荐

