如何按特定规则筛选DataFrame:优先保留del类记录
Pandas DataFrame 筛选:按number的记录规则保留del/undel条目
需求说明
处理包含number和reason列的DataFrame时,需遵循以下规则:
- 若同一
number同时存在del和undel两条记录,仅保留del记录 - 若同一
number仅有一条记录(无论reason是del还是undel),直接保留该记录
示例数据
原始DataFrame:
| number | reason |
|---|---|
| 1234 | del |
| 1234 | undel |
| 4567 | del |
| 6789 | undel |
| 2423 | del |
| 2423 | undel |
期望输出(先新增tofilter列,再筛选tofilter=1的记录):
| number | reason | tofilter |
|---|---|---|
| 1234 | del | 1 |
| 4567 | del | 1 |
| 6789 | undel | 1 |
| 2423 | del | 1 |
解决方案
方法一:分组统计+条件判断
import pandas as pd # 创建示例数据 df = pd.DataFrame({ 'number': [1234, 1234, 4567, 6789, 2423, 2423], 'reason': ['del', 'undel', 'del', 'undel', 'del', 'undel'] }) # 统计每个number对应的reason唯一值数量 df['reason_count'] = df.groupby('number')['reason'].transform('nunique') # 生成tofilter列 df['tofilter'] = df.apply( lambda x: 1 if (x['reason_count'] == 1) or (x['reason'] == 'del') else 0, axis=1 ) # 筛选目标记录,移除临时列 filtered_df = df[df['tofilter'] == 1].drop('reason_count', axis=1) print(filtered_df)
方法二:高效布尔索引(适合大数据量)
避免使用apply,提升处理效率:
import pandas as pd df = pd.DataFrame({ 'number': [1234, 1234, 4567, 6789, 2423, 2423], 'reason': ['del', 'undel', 'del', 'undel', 'del', 'undel'] }) # 标记每个number组是否同时包含del和undel has_both = df.groupby('number')['reason'].transform( lambda x: ('del' in x.values) and ('undel' in x.values) ) # 生成tofilter:组内无两种类型 或 当前记录是del df['tofilter'] = (~has_both) | (df['reason'] == 'del') # 转换为0/1整数类型 df['tofilter'] = df['tofilter'].astype(int) # 筛选结果 filtered_df = df[df['tofilter'] == 1] print(filtered_df)
输出结果
两种方法最终都会得到符合需求的筛选结果:
number reason tofilter 0 1234 del 1 2 4567 del 1 3 6789 undel 1 4 2423 del 1
内容的提问来源于stack exchange,提问作者Varun Nagrare
相关产品推荐
相关产品推荐

