Pandas对同一DataFrame列应用多个mask条件的最优写法
实现方案
最优简洁写法
你两个条件的核心逻辑是满足任意一个替换规则就用旧价覆盖当前价,直接把两个条件用逻辑或|合并,一次矢量化操作就能完成,性能最高,代码无冗余:
# 合并两个替换条件,注意单个条件要加括号避免运算符优先级问题 replace_mask = (df["price"].eq("£ 0.00")) | (df["product_price_old"].gt(df["price"])) # 单次mask完成替换 df["price"] = df["price"].mask(replace_mask, df["product_price_old"]) # 只用删除一次旧价格列即可 df.drop("product_price_old", axis=1, inplace=True)
相关问题解答
- 要不要用
.agg调用自定义函数?
完全不需要。agg主要用于分组聚合、多列聚合场景,你这个是单列逐行替换逻辑,用agg反而会增加不必要的性能开销,也不会让代码更简洁。 .pipe方法适用这个场景吗?
如果你这套价格更新逻辑需要在多个DataFrame上复用、或者要放到链式操作流里,可以封装成函数用pipe调用,示例如下:
如果只是单次执行逻辑,不需要额外用def update_price_col(df): replace_mask = (df["price"].eq("£ 0.00")) | (df["product_price_old"].gt(df["price"])) return df.assign(price=df["price"].mask(replace_mask, df["product_price_old"])).drop("product_price_old", axis=1) # 链式调用示例 df = pd.read_csv("你的数据路径.csv").pipe(update_price_col).reset_index(drop=True)pipe封装,直接写合并条件的代码即可。
注意事项
如果你的price和product_price_old列都是带货币符号的字符串类型,建议提前转换为数值类型再做大小比较,避免字符串字典序比较带来的逻辑错误。
内容的提问来源于stack exchange,提问作者dimButTries
相关产品推荐
相关产品推荐

