You need to enable JavaScript to run this app. Pandas DataFrame逐行比对两列值移除columnC重复元素及函数报错解决
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame逐行比对两列值移除columnC重复元素及函数报错解决

报错根因

  • pandas 的 apply 方法默认按列执行(默认参数 axis=0),每次调用自定义函数时,传入的参数是对应整列的 Series 对象,不会按照函数的参数定义,把两列的值拆成两个独立参数传入。这种传参模式下,需要两个必填位置参数的 remove_duplicate 函数实际只收到1个入参,自然会抛出 missing 1 required positional argument: 'columnC' 的类型错误。
  • 原代码自带的逻辑bug:
    • 判断元素存在性时写的 c_values.copy 是方法对象,不是调用后的集合副本,条件判断永远无法正确触发
    • 函数最后返回的是集合 c_values,而非提前拼接好的字符串 new_C,就算传参正确,也无法得到预期的字符串格式字段
    • 直接用无序集合处理拆分后的元素,会打乱 columnC 原有的元素顺序,最终拼接出的字符串顺序和原始逻辑不一致

修正实现

要实现逐行匹配多列值的清洗逻辑,需要给 apply 显式指定 axis=1,让函数按行接收入参,同时调整逻辑细节,保证元素顺序、返回值格式符合要求:

def remove_duplicate(row):
    # 从行对象中取出两个字段的取值
    current_a = row["columnA"]
    raw_c = row["columnC"]
    # 拆分原始columnC元素,保留原有顺序
    c_elements = raw_c.split("|")
    # 过滤掉和当前行columnA取值相同的元素
    keep_elements = [elem for elem in c_elements if elem != current_a]
    # 拼接回|分隔的字符串作为新的columnC值
    return "|".join(keep_elements)

# 逐行应用清洗函数
df["columnC"] = df[["columnA", "columnC"]].apply(remove_duplicate, axis=1)

执行后得到的结果和预期完全匹配:

columnA  columnB columnC
0       a        0        
1       c        1       f
2       b        2     a|c

说明:如果处理的数据集量级很大,逐行apply的运行效率不算最优,但对于这种需要逐行跨字段匹配的清洗逻辑,这种写法可读性最高,也能最大程度保留原始字段的元素顺序,避免出现顺序错乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 17:36:11