You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas如何根据另一列条件仅更新符合条件行的对应列值

问题根因

你原有代码的逻辑错误点非常明确:当循环判断到某件商品符合「红色+笔类」规则时,执行的赋值语句是对整个price列做统一上调运算,没有限定只修改当前匹配到的行,因此只要命中一次规则,全表商品价格都会被修改。同时pandas做这类条件筛选更新不需要写逐行循环,原生的布尔索引写法效率更高、逻辑更清晰。

最优实现方案

用pandas标准的布尔索引+loc定位做原地更新,全程不需要循环,只会修改符合条件的行:

import pandas as pd

df = pd.DataFrame({
    'item':['red ballpoint pen','red felt tip pen', 'blue ballpoint pen','red eraser'],
    'price':[1.50,2.00,1.50,.50]
})

# 构造行匹配掩码:逐行判断item是否同时包含red和pen
match_mask = (df['item'].str.contains('red')) & (df['item'].str.contains('pen'))
# 仅对匹配到的行的price列做10%上调
df.loc[match_mask, 'price'] *= 1.1

逻辑说明

  • str.contains()方法会逐行检测列内字符串是否包含指定关键词,返回长度和原表一致的布尔序列,True代表当前行匹配规则,False代表不匹配
  • 多个判断条件用&(与)、|(或)连接时,每个独立判断条件必须用括号包裹,避免运算符优先级导致的报错
  • df.loc[行筛选规则, 目标列名]可以精准定位符合条件的单元格,赋值时只会修改定位到的内容,其余行数据完全不受影响
补充:循环写法的修正(不推荐生产使用)

如果一定要保留循环逻辑,必须在命中规则时定位到当前行对应的单元格再赋值,不能直接操作整列:

# 逐行遍历索引和对应item值
for idx, item_name in df['item'].items():
    if 'red' in item_name and 'pen' in item_name:
        # 精准定位当前行的price单元格修改
        df.loc[idx, 'price'] *= 1.1

两种写法运行后得到的结果一致:

  • 红色圆珠笔价格从1.50上调为1.65
  • 红色毡头笔价格从2.00上调为2.20
  • 蓝色圆珠笔、红色橡皮价格保持原值不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:15:37