Pandas用for循环检测列重复值 解决duplicated()误判并拼接列值
问题根因
- 循环内的判断语句
df['col1'].duplicated().any()是对col1整列做全局重复校验,只要整列存在任意重复值,该判断就恒为True,和当前循环遍历到的具体行没有关联,因此每次循环都会触发拼接逻辑。 - 触发拼接时的赋值语句是对col1整列所有行执行拼接操作,并非仅修改存在重复的行,最终导致所有行的col1值都被拼接修改。
- 额外注意:代码中用
tuple作为变量名会覆盖Python内置的tuple类型,属于不规范写法。
修复方案
Pandas支持向量化操作,无需手写for循环逐行遍历,直接通过布尔掩码定位重复行再定向修改即可,执行效率更高逻辑也更清晰:
import pandas as pd data = [['Jake','NY'],['Tom','Montana'],['Hannah','Cali'],['Jason','Boston'],['Tom','Washington'],['Hannah','Florida']] df = pd.DataFrame(data, columns=('col1', 'col2')) # 生成重复值掩码:keep=False表示将所有重复出现的行(含首次出现的重复项)标记为True # 如果需要保留首次出现的重复值原值,仅修改后续重复项,将keep=False改为keep='first'即可 dup_mask = df['col1'].duplicated(keep=False) # 仅对掩码为True的重复行执行col1和col2的拼接 df.loc[dup_mask, 'col1'] = df.loc[dup_mask, 'col1'] + ' - ' + df.loc[dup_mask, 'col2']
执行后col1列的结果为:
- Jake(无重复,保持原值)
- Tom - Montana
- Hannah - Cali
- Jason(无重复,保持原值)
- Tom - Washington
- Hannah - Florida
内容的提问来源于stack exchange,提问作者Nazar
相关产品推荐
相关产品推荐

