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。
执行结果
| Year | Result | |
|---|---|---|
| 0 | 2004 | |
| 1 | 2004 | Negative |
| 2 | 2004 | |
| 3 | 2005 | Negative |
| 4 | 2005 | |
| 5 | 2005 | |
| 6 | 2005 | |
| 7 | 2003 | Negative |
| 8 | 2003 | |
| 9 | 2003 | |
| 10 | 2003 |
内容的提问来源于stack exchange,提问作者Oluf Sändrostrom
相关产品推荐
相关产品推荐

