Pandas DataFrame执行双if逻辑运算结果不符合预期如何修复
问题原因
你的代码错误是第二次np.where操作覆盖了第一次的标记结果:
- 第一次
np.where已经将大于70的行的A_op赋值为1,其余为2 - 第二次
np.where的逻辑是:小于40的赋值为3,其余所有行统一赋值为2,这就把第一次标记的1直接覆盖成了2,所以78.5对应的等级错误变成了2。
修复方法
方法1:修改第二次np.where的逻辑
只修改符合小于40条件的行,其余行保留第一次的计算结果即可:
import pandas as pd import numpy as np # 示例df df = pd.DataFrame({'A': [78.5, 54, 48, 21.1]}) adf = pd.DataFrame({'A_up':[70],'A_low':[40]}) adf = adf.loc[adf.index.repeat(len(df))] df['A_op'] = np.where((df['A']>adf['A_up'].values),1, 2) # 只改小于40的行,其余保留原有值 df['A_op'] = np.where((df['A']<adf['A_low'].values),3, df['A_op'])
方法2:使用更高效的pd.cut分箱(更适合大型DataFrame)
不需要额外创建重复的阈值表,一行代码就能完成分箱标记,性能更高:
df['A_op'] = pd.cut(df['A'], bins=[-float('inf'), 40, 70, float('inf')], labels=[3,2,1], right=False).astype(int)
这里right=False表示区间左闭右开,匹配你的需求:小于40为3、40<=数值<70为2、大于等于70为1,你也可以根据边界归属需求调整参数。
运行结果
两种方法输出都符合预期:
A A_op 0 78.5 1 1 54.0 2 2 48.0 2 3 21.1 3
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

