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

如何在R数据框中基于3个扫描结果列生成新状态列

解决方法:给DataFrame新增结果列

没问题,这个需求用Pandas就能轻松实现,核心是按照你说的优先级(2 > 1 > 空值)来判断每行的结果。我给你拆解步骤,再附上示例代码:

核心思路

  1. 优先判断是否存在2:只要扫描列里任意一个值是2,直接返回2;
  2. 判断是否全未完成:如果所有扫描列都是空值(未完成),返回空值;
  3. 剩余情况返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:53