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

如何高效修改Pandas DataFrame中重复列值的后续指定列值?

高效标记DataFrame中元素的首次出现

问题场景

现有如下两列的Pandas DataFrame:

FruitFirst Occurence?
"Apple""Yes"
"Orange""Yes"
"Apple""Yes"
"Apple""Yes"
"Kiwi""Yes"
"Banana""Yes"
"Apple""Yes"
"Orange""Yes"
"Orange""Yes"
"Banana""Yes"

可通过以下代码创建:

import pandas as pd

df = pd.DataFrame({
    'Fruit': ["Apple", "Orange", "Apple", "Apple", "Kiwi", "Banana", "Apple", "Orange", "Orange", "Banana"],
    'First Occurence?': ["Yes"]*10
})

需求与限制

需要将Fruit列中已出现过的元素对应的"First Occurence?"值改为"No",仅保留每个元素第一次出现时的"Yes",最终结果如下:

FruitFirst Occurence?
"Apple""Yes"
"Orange""Yes"
"Apple""No"
"Apple""No"
"Kiwi""Yes"
"Banana""Yes"
"Apple""No"
"Orange""No"
"Orange""No"
"Banana""No"

同时需满足:

  • 禁止使用循环(避免效率低下)
  • 必须保持行的原始顺序

解决方案

使用Pandas内置的duplicated()方法结合map()实现,这是矢量化操作,高效且不改变行顺序:

# 标记重复行并替换对应值
df['First Occurence?'] = df['Fruit'].duplicated().map({True: 'No', False: 'Yes'})

原理说明

  • df['Fruit'].duplicated():默认参数keep='first',会返回一个布尔值Series——第一次出现的元素对应False,重复出现的元素对应True
  • .map({True: 'No', False: 'Yes'}):将布尔值映射为需求的"Yes"/"No"字符串,直接覆盖原列的值

执行后即可得到符合要求的DataFrame,全程无循环,完全保留原始行顺序,处理效率远高于循环遍历。

内容的提问来源于stack exchange,提问作者Ben Nouhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:55:35