Pandas中drop_duplicates函数未按预期工作的问题排查
问题原因与解决方案
为什么drop_duplicates(keep='first')不符合预期?
pandas.Series.drop_duplicates()的核心逻辑是全局去重:它会遍历整个Series,只保留每个唯一值的第一次出现,后续所有和该值重复的元素都会被删除——不管这些元素是不是和前面的重复值连续。
放到你的数据场景里:
- 第一个
8672.0被保留后,后面所有的8672.0(包括中间再次出现的那一大组)都会被判定为重复并删除 - 第一个
8670.0被保留后,后续所有的8670.0也会被过滤掉
所以最终只返回两个全局唯一值,和你的预期不符。
如何实现“保留每个连续重复块的第一个元素”?
你需要的是识别连续重复的分组,而非全局唯一值。可以通过对比当前元素与前一个元素是否不同来实现:
import pandas as pd # 构造你的Series数据 s = pd.Series( [8672.0]*4 + [8670.0]*6 + [8672.0]*10 + [8670.0]*5 ) # 生成标记:当前值和前一个值不同的位置(首元素默认标记为True) mask = s != s.shift() # 筛选出标记为True的元素,即每个连续块的第一个值 expected_result = s[mask] print(expected_result.values) # 输出:[8672.0 8670.0 8672.0 8670.0]
补充说明
shift()默认将元素向后移动一位,这样我们就能逐个对比当前元素和它的前一个元素- 首元素的前一个值是
NaN,在pandas中NaN和任何值比较都会返回True,所以首元素会被自动保留,正好符合“第一个块的起始元素”的需求
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

