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

如何在Pandas DataFrame中基于两列条件实现IF/ELSE生成新列

基于多列条件生成Pandas新列的解决方案

先明确:apply(lambda x...)完全支持多列参数,只要设置axis=1(按行遍历)就行,此时x对应DataFrame的每一行,直接通过x['列名']就能访问任意列的值。

不过要提一句:Pandas里做条件列生成,向量化操作比apply效率高得多,尤其是处理大数据集的时候。下面给你两种可行方案:

方案1:用apply实现(符合你的思路,直观但效率稍低)

直接写lambda函数处理每一行,判断条件后赋值:

# 这里默认逻辑设为返回原种族和族裔的组合,你可以改成自己需要的规则
cdc_df['Combined_Demographic'] = cdc_df.apply(
    lambda x: 'Hispanic' if (x['Race'] == 'Caucasian' and x['Ethnicity'] == 'Hispanic') 
    else f"{x['Race']}-{x['Ethnicity']}",
    axis=1
)

如果默认逻辑复杂,也可以单独写个函数:

def get_demographic(row):
    if row['Race'] == 'Caucasian' and row['Ethnicity'] == 'Hispanic':
        return 'Hispanic'
    # 替换成你的默认逻辑,比如返回原Ethnicity或者其他自定义值
    return row['Ethnicity']

cdc_df['Combined_Demographic'] = cdc_df.apply(get_demographic, axis=1)

方案2:向量化操作(推荐,性能更优)

用numpy.where或者Pandas的loc批量赋值,避免逐行循环:

方法A:numpy.where

import numpy as np

# 定义判断条件
condition = (cdc_df['Race'] == 'Caucasian') & (cdc_df['Ethnicity'] == 'Hispanic')
# 生成新列:满足条件返回'Hispanic',否则用默认值(示例用原Ethnicity,可修改)
cdc_df['Combined_Demographic'] = np.where(condition, 'Hispanic', cdc_df['Ethnicity'])

方法B:Pandas loc直接赋值

# 先给新列设置默认值(根据你的需求调整)
cdc_df['Combined_Demographic'] = cdc_df['Ethnicity']
# 对满足条件的行更新值
cdc_df.loc[(cdc_df['Race'] == 'Caucasian') & (cdc_df['Ethnicity'] == 'Hispanic'), 'Combined_Demographic'] = 'Hispanic'

要点总结

  • apply(axis=1)确实能访问多列,x是每行的Series,取列值很方便
  • 大数据集优先用向量化方案,apply是逐行循环,数据量越大性能差距越明显
  • 记得把代码里的默认逻辑部分改成你实际需要的规则,比如示例里的组合字符串或原Ethnicity,替换成你的默认值生成方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:15:34