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
相关产品推荐
相关产品推荐

