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

基于多条件新增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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:14:24