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

如何在Pandas DataFrame中筛选A列重复且B列值不同的行?

解决方案:筛选A列重复且对应B列存在差异的行

需求回顾

给定如下DataFrame:

idxAB
0a1b1
1a2b1
2a2b2
3a2b1
4a3b3
5a3b3
6a4b1

需要筛选出A列值重复,且该A值对应的B列存在至少两种不同值的所有行,保留原索引。最终结果仅保留A为a2的所有行。

实现步骤

1. 构造示例数据

首先还原示例DataFrame:

import pandas as pd

df = pd.DataFrame({
    'idx': [0, 1, 2, 3, 4, 5, 6],
    'A': ['a1', 'a2', 'a2', 'a2', 'a3', 'a3', 'a4'],
    'B': ['b1', 'b1', 'b2', 'b1', 'b3', 'b3', 'b1']
})

2. 核心筛选逻辑

我们需要先定位符合条件的A值:这类A值需要满足两个条件:

  • A值在列中重复出现(出现次数>1)
  • 该A值对应的B列存在至少两种不同的值

可以通过两种方式实现:

方式一:分步统计筛选
# 统计每个A对应的B唯一值数量、A的出现次数
group_stats = df.groupby('A').agg(
    b_unique_count=('B', 'nunique'),
    a_occurrence=('A', 'count')
)

# 筛选出符合条件的A值
target_a_values = group_stats[
    (group_stats['b_unique_count'] > 1) & 
    (group_stats['a_occurrence'] > 1)
].index

# 过滤原DataFrame得到结果
result = df[df['A'].isin(target_a_values)]
方式二:链式过滤(更简洁)

利用groupby.filter直接筛选出符合条件的分组行,再提取对应的A值进行过滤:

result = df[
    df['A'].isin(
        df.groupby('A')
          .filter(lambda group: group['B'].nunique() > 1)
          ['A']
          .unique()
    )
]

3. 验证结果

执行上述代码后,result的输出与预期一致:

idxAB
1a2b1
2a2b2
3a2b1

逻辑说明

  • 剔除a1和a4:因为它们在A列仅出现一次,不符合"A列重复"的条件
  • 剔除a3:虽然A列重复,但对应的B列值全为b3,不存在差异
  • 保留a2的所有行:A列重复,且B列存在b1和b2两种不同值,无论该行的B值是否重复,只要属于该A组就保留

内容的提问来源于stack exchange,提问作者Xaree Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:20:19