如何在Pandas DataFrame中筛选A列重复且B列值不同的行?
解决方案:筛选A列重复且对应B列存在差异的行
需求回顾
给定如下DataFrame:
| idx | A | B |
|---|---|---|
| 0 | a1 | b1 |
| 1 | a2 | b1 |
| 2 | a2 | b2 |
| 3 | a2 | b1 |
| 4 | a3 | b3 |
| 5 | a3 | b3 |
| 6 | a4 | b1 |
需要筛选出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的输出与预期一致:
| idx | A | B |
|---|---|---|
| 1 | a2 | b1 |
| 2 | a2 | b2 |
| 3 | a2 | b1 |
逻辑说明
- 剔除
a1和a4:因为它们在A列仅出现一次,不符合"A列重复"的条件 - 剔除
a3:虽然A列重复,但对应的B列值全为b3,不存在差异 - 保留
a2的所有行:A列重复,且B列存在b1和b2两种不同值,无论该行的B值是否重复,只要属于该A组就保留
内容的提问来源于stack exchange,提问作者Xaree Lee
相关产品推荐
相关产品推荐

