如何在Pandas中移除满足特定分组条件的数据行?
Pandas 实现方案
问题回顾
给定如下原始数据:
| RefNo | rest1 | Pair | rest2 |
|---|---|---|---|
| A | 11 | A | 11 |
| B | 22 | E | 55 |
| C | 33 | C | 22 |
| C | 33 | F | 66 |
| D | 44 | D | 44 |
| D | 44 | G | 77 |
| D | 44 | H | 88 |
需要按RefNo分组后,移除同时满足以下两个条件的行:
- 该行的
RefNo与Pair值相等 - 该分组内
Pair字段的唯一值数量为1
代码实现
import pandas as pd # 构造原始数据 data = { 'RefNo': ['A', 'B', 'C', 'C', 'D', 'D', 'D'], 'rest1': [11, 22, 33, 33, 44, 44, 44], 'Pair': ['A', 'E', 'C', 'F', 'D', 'G', 'H'], 'rest2': [11, 55, 22, 66, 44, 77, 88] } df = pd.DataFrame(data) # 1. 计算每个RefNo分组内Pair的唯一值数量,添加为临时列 df['pair_unique_count'] = df.groupby('RefNo')['Pair'].transform('nunique') # 2. 筛选保留符合要求的行,移除临时列 filtered_df = df[~((df['RefNo'] == df['Pair']) & (df['pair_unique_count'] == 1))].drop(columns='pair_unique_count') print(filtered_df)
代码说明
groupby('RefNo')['Pair'].transform('nunique'):对每个RefNo分组统计Pair的唯一值数量,通过transform将结果映射回原数据的每一行,保证行数与原数据一致。- 筛选条件
~((df['RefNo'] == df['Pair']) & (df['pair_unique_count'] == 1)):取反同时满足两个删除条件的行,保留所有不符合删除规则的数据。 drop(columns='pair_unique_count'):移除临时添加的辅助列,得到最终的目标数据。
输出结果
运行代码后将得到预期结果:
| RefNo | rest1 | Pair | rest2 |
|---|---|---|---|
| B | 22 | E | 55 |
| C | 33 | C | 22 |
| C | 33 | F | 66 |
| D | 44 | D | 44 |
| D | 44 | G | 77 |
| D | 44 | H | 88 |
内容的提问来源于stack exchange,提问作者BKP
相关产品推荐
相关产品推荐

