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

Python中按Year分组后对Result列Negative值去重的实现方法

按Year分组去除Result列重复的Negative值(仅保留首次出现)

问题描述

需要按Year列分组,对Result列中的Negative值进行去重处理:仅保留每组内首次出现的Negative,其余重复的Negative设为NaN。

原始数据定义

import pandas as pd

df = pd.DataFrame( {
"Year" : ["2004", "2004", "2004", "2005", "2005","2005", "2005", "2003","2003", "2003", "2003"] ,
"Result" : ["NaN", "Negative", "Negative", "Negative", "NaN", "Negative", "NaN","Negative", "NaN", "Negative", "NaN"] } )

原代码问题

你尝试的代码df['Result'] = df.groupby(['Year'])['Result'].duplicated()无法生效,原因是duplicated()返回的是布尔值(True/False),直接赋值会覆盖原Result列的内容,完全不符合保留原有值并修改重复项的需求。

正确解决方案

我们可以结合groupby.transform()和条件判断,精准定位每组内重复的Negative并替换为NaN:

# 先将字符串"NaN"转换为pandas识别的缺失值(规范处理,可选)
df['Result'] = df['Result'].replace('NaN', pd.NA)

# 按Year分组,对每组的Result列执行去重逻辑
df['Result'] = df.groupby('Year')['Result'].transform(
    lambda x: x.where(~((x == 'Negative') & x.duplicated()), pd.NA)
)

print(df)

代码解释

  • groupby('Year')['Result'].transform():对每个Year分组内的Result列执行自定义逻辑,返回与原DataFrame长度一致的结果。
  • x.where(~((x == 'Negative') & x.duplicated()), pd.NA):
    • (x == 'Negative') & x.duplicated():标记出每组内重复出现的Negative(即不是第一次出现的Negative)。
    • ~取反后,x.where()会保留符合条件的原值,将不符合条件(重复的Negative)替换为pd.NA。

执行结果

YearResult
02004
12004Negative
22004
32005Negative
42005
52005
62005
72003Negative
82003
92003
102003

内容的提问来源于stack exchange,提问作者Oluf Sändrostrom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:01:04