Pandas实现c3列值与同一行其他列重复则置空及报错处理
错误原因
你写的代码存在4处核心问题,报错正是因为逻辑颠倒导致成员运算的右操作数是不可迭代的数值类型:
- 成员运算逻辑完全写反:你需要判断的是c3的值是否存在于同行列c1、c2中,不是判断c1/c2是否存在于c3中。后者要求c3必须是可迭代对象,若c3列为数值类型就会抛出
numpy.int64不可迭代的报错。 - 逻辑运算符使用错误:
x.c1 or x.c2 not in x.c3是错误的逻辑表达,or是逻辑或运算符,不会同时校验c1、c2两个值是否满足条件,执行时只要x.c1布尔值为真就会直接跳过后半段判断,完全不符合需求。 - 返回值类型不匹配:lambda中你返回了
x(整行Series对象),但你是给c3单列赋值,应该仅返回c3对应的单个值或空值。 - 空值未定义:pandas的空值是
np.nan,需要先导入numpy库才能使用,你写的Nan属于未定义变量,运行也会抛出NameError。
正确实现方案
方案1:精简apply写法(小数据量适用,可读性高)
import pandas as pd import numpy as np df = pd.DataFrame({'c1': ["dog", "cat", "bird"], 'c2': ["rabbit", "rat", "snake"], 'c3': ["dog", "fish", "snake"]}) # 核心逻辑:如果c3值在同行列c1、c2的列表中,就返回空,否则返回原c3值 df["c3"] = df.apply(lambda x: np.nan if x["c3"] in [x["c1"], x["c2"]] else x["c3"], axis=1)
方案2:向量化运算(大数据量适用,性能远高于apply)
# 逻辑:判断c1、c2列逐行是否等于c3,只要有一个相等就把c3设为空 df["c3"] = df["c3"].where(~df[["c1","c2"]].eq(df["c3"], axis=0).any(axis=1), np.nan)
运行结果
处理后的df如下:
| c1 | c2 | c3 |
|---|---|---|
| dog | rabbit | nan |
| cat | rat | fish |
| bird | snake | nan |
内容的提问来源于stack exchange,提问作者SMJune
相关产品推荐
相关产品推荐

