如何用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
相关产品推荐
相关产品推荐

