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

