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

Python如何按条件修改DataFrame数值 解决相关报错及取模疑问

问题排查与解决方案

1. 报错原因说明

你编写的for循环仅定义了行索引遍历变量i,但判断条件中没有使用i定位对应行的单个值,直接对整列Series做布尔判断,Pandas无法确定需要判断整列还是单个元素的布尔值,因此抛出ValueError: The truth value of a DataFrame is ambiguous报错。

2. float取模问题说明

Python原生支持float类型使用%运算符做取模运算,仅需注意浮点数精度误差可能带来的计算偏差即可。你原有代码中的df['Probability'] %2 == 0是判断整个数值是否为偶数,和你要求的「数值末位为偶数」的逻辑不符,需要先提取小数部分的最后一位再做奇偶判断。

3. 实现代码

方案1:修复原有for循环逻辑

for i in range(df.shape[0]):
    # 提取Probability的末位数字(因数值为1位小数,乘10取整后取最后一位)
    prob_last_num = int(round(df.loc[i, 'Probability'] * 10)) % 10
    if prob_last_num % 2 == 0:
        df.loc[i, 'Probability'] += 0.1
    if df.loc[i, 'Color'] == 'Red':
        # 成本提高10%即乘以1.1,原有代码的*0.01仅为1%涨幅,逻辑有误已修正
        df.loc[i, 'Cost'] *= 1.1

方案2:Pandas向量化操作(更高效,推荐使用,无需遍历行)

# 处理Probability列:末位为偶数则加0.1
last_num = (df['Probability'].round(1) * 10).astype(int) % 10
df.loc[last_num % 2 == 0, 'Probability'] += 0.1

# 处理Color为Red的行:Cost提高10%
df.loc[df['Color'] == 'Red', 'Cost'] *= 1.1

注意事项

  • 代码中加入round操作是为了避免浮点数精度问题导致的末位提取错误,例如部分float存储时1.8可能被存为1.7999999999999998,乘10转int后会得到17,加round可规避该问题
  • 原有Cost涨幅逻辑错误已修正,10%涨幅对应原值乘以1.1

内容的提问来源于stack exchange,提问作者Tiana Chargin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:36:02