如何在R数据框中基于3个扫描结果列生成新状态列
解决方法:给DataFrame新增结果列
没问题,这个需求用Pandas就能轻松实现,核心是按照你说的优先级(2 > 1 > 空值)来判断每行的结果。我给你拆解步骤,再附上示例代码:
核心思路
- 优先判断是否存在2:只要扫描列里任意一个值是2,直接返回2;
- 判断是否全未完成:如果所有扫描列都是空值(未完成),返回空值;
- 剩余情况返回1:排除上面两种情况后,说明所有完成的扫描结果都是1,返回1。
代码实现
假设你的扫描列名为scan1、scan2、scan3(如果实际列名不同,替换成你自己的列名即可):
import pandas as pd import numpy as np # 1. 定义你的扫描列列表 scan_columns = ["scan1", "scan2", "scan3"] # 2. 生成判断条件 # 检查每行是否有任意一个2 has_positive = df[scan_columns].eq(2).any(axis=1) # 检查每行是否所有扫描列都是空值 all_unfinished = df[scan_columns].isna().all(axis=1) # 3. 新增结果列,用嵌套np.where实现优先级判断 df["final_result"] = np.where( has_positive, 2, np.where(all_unfinished, np.nan, 1) )
示例演示
我们构造一个示例DataFrame来验证效果:
# 构造测试数据 test_data = { "Id": [1, 2, 3, 4, 5], "scan1": [1, 2, np.nan, 1, np.nan], "scan2": [1, np.nan, np.nan, np.nan, np.nan], "scan3": [2, 1, np.nan, 1, np.nan] } df = pd.DataFrame(test_data) # 运行上面的代码生成结果列后,输出如下: print(df)
输出结果:
Id scan1 scan2 scan3 final_result 0 1 1.0 1.0 2.0 2.0 1 2 2.0 NaN 1.0 2.0 2 3 NaN NaN NaN NaN 3 4 1.0 NaN 1.0 1.0 4 5 NaN NaN NaN NaN
说明:
- 第0、1行存在2,结果返回2;
- 第2、5行所有扫描都未完成,返回空值;
- 第4行完成的扫描都是1,返回1。
注意事项
如果你的“无值”不是Pandas默认的NaN(比如是空字符串""),需要把isna()改成eq("").all(axis=1)来适配。
内容的提问来源于stack exchange,提问作者Ruth Johnson
相关产品推荐
相关产品推荐

