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

Python pandas基于多列条件用if-else创建新列报语法错误

Pandas多条件创建新列语法错误修复方案

原代码错误点

  • 缩进不符合Python语法规范:elif、else缩进层级和对应的if不匹配,直接触发语法报错
  • 列名拼写、大小写不匹配:代码中使用的random、recommendation和DataFrame实际列名Random、Recommandation不一致,运行会报键不存在错误
  • 条件判断写法错误:if后直接传入DataFrame布尔筛选结果,返回的是子数据集而非单布尔值,无法用于逐行分支判断
  • 变量使用顺序错误:函数开头执行print(x)时x还未赋值,会触发变量未定义错误
  • 逻辑实现偏差:原函数没有按逐行判断的优先级执行赋值,无法得到符合规则的结果

可直接运行的正确代码

优先使用pandas内置向量化方法实现,运行效率更高:

import pandas as pd
import numpy as np

# 构造测试数据集
df = pd.DataFrame(np.random.randint(0,30,size=10),
                 columns=["Random"],
                 index=pd.date_range("20180101", periods=10))
df = df.reset_index()
df['Recommandation'] = ['No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes', 'No']
df['diff'] = [3,2,4,1,6,1,2,2,3,1]

# 定义判断条件
is_first_3days = df['index'].isin(pd.to_datetime(["2018-01-01", "2018-01-02", "2018-01-03"]))
is_yes_reco = (~is_first_3days) & (df['Recommandation'] == "Yes")

# 按规则赋值
df["new"] = np.select(
    condlist=[is_first_3days, is_yes_reco],
    choicelist=[df["Random"], df["Random"].shift(1) + df["diff"]],
    default=df["Random"].shift(1)
)

print(df)

如果需要用逐行遍历的写法,可参考以下实现(自动处理上一行值的读取,避免索引错位):

new_col = []
last_random = None

for i, row in df.iterrows():
    if i < 3:
        # 前3行直接取当前Random值
        val = row["Random"]
    elif row["Recommandation"] == "Yes":
        val = last_random + row["diff"]
    else:
        val = last_random
    new_col.append(val)
    # 更新上一行Random值为当前行值,供下一行计算使用
    last_random = row["Random"]

df["new"] = new_col

说明:由于测试集中Random列是随机整数,每次运行生成的new列数值不会和你给出的示例值完全一致,只要赋值逻辑匹配规则即为正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:03:19