Pandas DataFrame多列多规则组合计算复合结果不符合预期问题
问题原因及解决方案
核心问题原因
any()用法完全错误:df['Amount'].any()会直接返回布尔值(只要列里有非0/非空值就返回True),你后续用布尔值和50比较,True < 50永远成立,所以代码永远走if分支,所有行Rule_No都被设为0,不会进入else逻辑。同时你规则里的阈值是5000,代码里错写为50,数值也不匹配。
- 列名引用错误:DataFrame里的90天最大值列名为
Max_90D,你代码里错写为90D_Max,会导致取值错误,条件判断失效。
- 列名引用错误:DataFrame里的90天最大值列名为
- 规则逻辑理解错误:你原描述的规则1和你给出的预期输出存在冲突(按照原规则1第四行Amount为1000小于5000,应该赋值0,但你的预期输出是6),从预期输出反推,实际需要的是行级判断,不需要全局的if-else分支,所有逻辑直接在行维度处理即可。
正确实现代码
import pandas as pd import numpy as np # 先把createdAt转为datetime类型,确保可以取时间属性 df['createdAt'] = pd.to_datetime(df['createdAt']) # 定义行级判断条件 # 条件1:交易时间晚于23点或早于8点 time_rule = (df['createdAt'].dt.hour >= 23) | (df['createdAt'].dt.hour < 8) # 条件2:交易金额大于1.5倍Max_90D amount_rule = df['Amount'] > 1.5 * df['Max_90D'] # 满足任意一个条件赋值6,否则赋值0 df['Rule_No'] = np.where(time_rule | amount_rule, 6, 0)
运行上述代码就可以得到你给出的预期输出结果。
内容的提问来源于stack exchange,提问作者pythondumb
相关产品推荐
相关产品推荐

