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

如何用Pandas基于多条件和空值检查为DataFrame新增列

Pandas 实现多条件分支新增列方案

对应你给出的SQL CASE逻辑,有3种常用实现方式,按推荐优先级排序:

方法1:numpy.select(兼容性最优,性能高,全版本通用)

和SQL逻辑一一对应,适合所有pandas版本,百万级数据量也能快速运行:

import pandas as pd
import numpy as np

# 假设df为你的原始DataFrame
conditions = [
    # 对应第一个when条件:Apply_To和Comment_Code都为空
    df['Apply_To'].isna() & df['Comment_Code'].isna(),
    # 对应第二个when条件:仅Apply_To为空
    df['Apply_To'].isna()
]
values = [
    'Worked',
    df['Comment_Code']
]
# default对应else逻辑
df['Hours'] = np.select(conditions, values, default=df['Apply_To'])

方法2:Series.case_when(写法最贴近SQL,pandas≥1.3.0可用)

写法和SQL CASE几乎完全一致,可读性最高:

df['Hours'] = df['Apply_To'].case_when(
    [
        (df['Apply_To'].isna() & df['Comment_Code'].isna(), 'Worked'),
        (df['Apply_To'].isna(), df['Comment_Code'])
    ],
    default=df['Apply_To']
)

方法3:自定义函数+apply(适合逻辑极复杂场景,性能较低)

仅推荐用于小数据量、逻辑非常复杂的场景,大数据量运行会很慢:

def calc_hours(row):
    if pd.isna(row['Apply_To']) and pd.isna(row['Comment_Code']):
        return 'Worked'
    elif pd.isna(row['Apply_To']):
        return row['Comment_Code']
    return row['Apply_To']

df['Hours'] = df.apply(calc_hours, axis=1)

注意事项

判断空值必须用pd.isna()或者Series自带的.isna()方法,不要直接写== None,否则会识别不到pandas原生的NaN空值。如果你的数据里空值是字符串形式的'null',需要先做替换再执行上面的逻辑:

df[['Apply_To', 'Comment_Code']] = df[['Apply_To', 'Comment_Code']].replace('null', pd.NA)

内容的提问来源于stack exchange,提问作者Dru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:36:01