如何在Pandas中基于部分匹配条件创建新列?
错误原因分析
- 初始
apply写法:排除swifter适配问题的话,单条件下逻辑本身是可以运行的,报错大概率是你代码中额外加了any()判断——单个字符串传入any()会遍历每个字符,只要字符串非空就返回True,直接导致判断逻辑完全失效。 np.where写法报错:属于语法错误,你在语句末尾多了: return "Things"的无效内容,标准np.where语法不需要额外的return语句。你提到的「循环内无法生效」的问题,只要在循环内正确引用当前操作的DataFrame变量名即可,注意不要写错变量(比如示例里你定义的是df但调用时写的是df2)。- 补充的自定义函数写法错误:
conditions函数既没有定义返回值,也没有接收正确的参数,直接把函数对象传给np.where当然会出现长度不匹配的问题。 - 其他无效写法:
df["new_column"] == "ores" is True: return "things"属于完全不符合Python语法的写法,Pandas没有这种直接赋值加判断的语句规则。
正确实现方案
方案1:矢量化实现(性能最优,无需apply)
单条件场景直接用一行代码即可,不需要自定义函数,完全适配循环内调用的场景,也不需要用np.select:
import pandas as pd import numpy as np df = pd.DataFrame([["ores"], ["ores + more texts"], ["anything else"]], columns=['Symptom']) # 包含ores返回Things,不满足条件可以自定义返回其他值,比如空字符串 df["new_column"] = np.where(df["Symptom"].str.contains("ores", na=False), "Things", "")
这里的na=False是为了处理Symptom列存在空值的场景,避免判断时返回NaN报错。
方案2:apply自定义函数(适合多条件逻辑,方便编辑)
如果你有多个判断条件需要频繁修改,又不想维护独立的条件列表,可以用apply的标准写法,所有逻辑都收拢在函数内部,修改非常方便:
def conditions(row): if "ores" in row["Symptom"]: return "Things" # 后续新增条件直接加elif即可 elif "test" in row["Symptom"]: return "其他返回值" # 不满足所有条件的默认返回值 else: return "" df["new_column"] = df.apply(conditions, axis=1)
如果要保留swifter加速,直接把df.apply改成df.swifter.apply即可,只要Symptom列没有非字符串类型的值就不会报错。
内容的提问来源于stack exchange,提问作者SRP
相关产品推荐
相关产品推荐

