如何高效修改Pandas DataFrame中重复列值的后续指定列值?
高效标记DataFrame中元素的首次出现
问题场景
现有如下两列的Pandas DataFrame:
| Fruit | First 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",最终结果如下:
| Fruit | First 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
相关产品推荐
相关产品推荐

