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
相关产品推荐
相关产品推荐

