基于多条件新增DataFrame列结果不符的问题排查求助
问题分析与修正
你的问题出在函数逻辑和预期需求完全相反上,咱们一步步拆解清楚:
当前逻辑的问题
你写的seekDO函数是:只要三个条件中的任意一个满足(某一步的比值小于A),就直接返回1;只有当三个条件全不满足时才返回0。但看你的预期结果,你实际想要的逻辑是:只有当三个条件全部满足(即累加完s1、s2后,比值仍然小于A),才返回1;否则只要有任何一步累加后比值≥A,就返回0。
拿第15行的数据验证就很清楚:
- 第一步:
6/17 ≈ 0.35 < 0.8→ 满足当前函数的第一个条件,直接返回1,但你的预期是0; - 但你实际需要判断的是:加完s1后
(6+8)/17 ≈ 0.82 ≥ 0.8,这时候就应该返回0了。
修正后的函数
把逻辑改成三个条件必须同时满足才返回1,同时加上NaN的判断避免运算警告:
A = 0.8 def seekDO(row): # 先检查关键列是否有缺失值,有则直接返回0 if row[['Qh_STA', 'Qh_FID2', 's1', 's2']].isnull().any(): return 0 # 三个条件必须同时满足才返回1 ratio1 = row['Qh_STA'] / row['Qh_FID2'] ratio2 = (row['Qh_STA'] + row['s1']) / row['Qh_FID2'] ratio3 = (row['Qh_STA'] + row['s1'] + row['s2']) / row['Qh_FID2'] return 1 if (ratio1 < A and ratio2 < A and ratio3 < A) else 0 df['DO'] = df.apply(seekDO, axis=1)
验证结果
运行修正后的代码,得到的DO列会和你的预期完全一致:
- 第14行:三个比值都小于0.8 → 返回1;
- 第15行:第一个比值小于0.8,但第二个比值≥0.8 → 返回0;
- 第13行:前两个比值小于0.8,但第三个比值等于1≥0.8 → 返回0;
- 第17行:存在缺失值 → 返回0。
更高效的向量化写法(可选)
如果你的DataFrame数据量很大,推荐用向量化运算替代apply,速度会快很多:
A = 0.8 # 计算三个条件的布尔值 cond1 = df['Qh_STA'] / df['Qh_FID2'] < A cond2 = (df['Qh_STA'] + df['s1']) / df['Qh_FID2'] < A cond3 = (df['Qh_STA'] + df['s1'] + df['s2']) / df['Qh_FID2'] < A # 合并条件,缺失值处填充0并转为整数 df['DO'] = (cond1 & cond2 & cond3).astype(int).fillna(0)
内容的提问来源于stack exchange,提问作者energyMax
相关产品推荐
相关产品推荐

