pandas如何将列中第二次及以后出现的重复值替换为另一列对应值
实现方案
核心是通过pandas内置的重复值标记方法定位需要替换的行,直接做向量化赋值即可,不需要逐行遍历。
实现代码
如果需要复现测试,可以先构造对应结构的示例数据:
import pandas as pd # 匹配问题给出的原始数据结构 df = pd.DataFrame({ 'Sl': [1, 2, 3, 4, 5], 'Name': ['abc', 'pqr', 'abc', 'abc', 'cde'], 'Name2': ['abc e', 'lmn o', 'abc e', 'krs', 'rmn'] })
执行替换逻辑仅需两行代码:
# 标记Name列中所有非首次出现的重复行,首次出现的取值不标记 replace_mask = df['Name'].duplicated(keep='first') # 将标记行的Name列值替换为对应行的Name2取值 df.loc[replace_mask, 'Name'] = df.loc[replace_mask, 'Name2']
执行结果
运行后打印df得到的输出如下,完全匹配替换要求:
Sl Name Name2 0 1 abc abc e 1 2 pqr lmn o 2 3 abc e abc e 3 4 krs krs 4 5 cde rmn
说明:你给出的目标示例里第一行Name2显示为
abc属于排版对齐偏差,上述逻辑不会修改Name2列的原始值,如果需要同步调整Name2列的取值,补充对应赋值语句即可。
逻辑说明
duplicated(keep='first')是pandas专门用于标记重复值的方法,传入keep='first'参数时,会把每个取值第一次出现的行标记为False(不需要替换),后续所有重复出现的行标记为True(需要替换),完全匹配“从第二次重复出现开始替换”的规则。- 用
df.loc做定位赋值是pandas的原生向量化操作,执行效率远高于apply或者手写循环,数据量大的时候性能优势非常明显。
内容的提问来源于stack exchange,提问作者JDoe
相关产品推荐
相关产品推荐

