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

如何按特定规则筛选DataFrame:优先保留del类记录

Pandas DataFrame 筛选:按number的记录规则保留del/undel条目

需求说明

处理包含number和reason列的DataFrame时,需遵循以下规则:

  • 若同一number同时存在del和undel两条记录,仅保留del记录
  • 若同一number仅有一条记录(无论reason是del还是undel),直接保留该记录

示例数据

原始DataFrame:

numberreason
1234del
1234undel
4567del
6789undel
2423del
2423undel

期望输出(先新增tofilter列,再筛选tofilter=1的记录):

numberreasontofilter
1234del1
4567del1
6789undel1
2423del1

解决方案

方法一:分组统计+条件判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:10:28