You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于层级计数筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:23:39