Pandas如何基于另一列条件创建新列并处理指定列缺失值
错误原因
你的代码全部返回lts是两个问题导致的:
- 第一个判断分支
if np.where(clin["days_to_death"],np.nan,1):逻辑完全错误:np.where在这里返回的是数组对象,Python中非空对象的布尔判断永远为True,所以第一个分支永远触发,后续判断根本不会执行。 - 你构造的原始数据中
days_to_death列是字符串与nan混合的类型,直接调用astype(int)会触发类型错误,且你没有用正确的方法判断NA值。
正确实现
优先用pandas向量化操作实现,运行效率远高于apply方法,逻辑也更清晰:
import numpy as np import pandas as pd from math import nan # 此处省略你提供的clin DataFrame构造代码 # 1. 先将days_to_death列转为数值类型,无法解析的字符串/空值统一转为pd.NA clin["days_to_death"] = pd.to_numeric(clin["days_to_death"], errors="coerce") # 2. 按规则生成SURV列 clin["SURV"] = np.where( clin["days_to_death"].isna() | (clin["days_to_death"] >= 2 * 365), "lts", "non-lts" ) # 3. 删除除days_to_death外其他列包含NA的行 exclude_col = "days_to_death" check_cols = clin.columns.drop(exclude_col) clin = clin.dropna(subset=check_cols, how="any")
如果你一定要用自定义函数结合apply的写法,修正后的函数如下:
def survival(row): dtd = pd.to_numeric(row["days_to_death"], errors="coerce") if pd.isna(dtd) or dtd >= 2 * 365: return "lts" return "non-lts" clin["SURV"] = clin.apply(survival, axis=1)
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

