基于多条件(含空值与分类值)创建DataFrame新变量
嘿,我懂你现在的困扰——要基于SL_Local和SL_State两列的几十种组合规则生成新列SL,普通的if/else链写起来不仅繁琐,后期维护也麻烦。这里有几个实用的方案,你可以根据自己的场景选:
方案1:用numpy.select处理多条件(推荐大数据量)
这个方法把所有条件和对应结果一一列出,可读性强,而且运行效率比apply高很多,适合处理大型DataFrame。你只需要把20种规则依次添加到条件和结果列表里就行:
import pandas as pd import numpy as np # 示例DataFrame(你可以替换成自己的数据) df = pd.DataFrame({ 'SL_Local': ['D', np.nan, 'X', 'D', 'Y'], 'SL_State': ['I', 'A', 'B', 'B', 'C'] }) # 定义条件列表:每个元素是一个布尔Series,对应一种规则 conditions = [ # 规则1:SL_Local为空时,SL取SL_State df['SL_Local'].isna(), # 规则2:SL_Local为D且SL_State为I时,SL取D (df['SL_Local'] == 'D') & (df['SL_State'] == 'I'), # 规则3:可以继续添加你的其他组合,比如: # (df['SL_Local'] == 'X') & (df['SL_State'] == 'B'), # (df['SL_Local'] == 'Y') & (df['SL_State'] == 'C'), # ... 把剩下的17+种规则都加在这里 ] # 定义结果列表:和上面的条件一一对应,每个元素是满足条件时的SL值 results = [ df['SL_State'], 'D', # 'X', # 'CustomResult', # ... 对应上面的结果 ] # 设置默认值:如果所有条件都不满足,这里可以根据需求调整,比如取SL_Local default_value = df['SL_Local'] # 生成新列SL df['SL'] = np.select(conditions, results, default=default_value)
优势:逻辑清晰,添加/修改规则只需要在两个列表里加一行,运行速度快,适合大数据集。
方案2:用字典映射明确组合规则
如果你的20种规则都是明确的(SL_Local, SL_State)组合对应固定SL值,用字典来映射会非常直观:
# 构建规则字典:key是(SL_Local, SL_State)的元组,value是对应的SL结果 rule_dict = { (np.nan, 'A'): 'A', # SL_Local为空且SL_State为A时取A ('D', 'I'): 'D', # SL_Local=D且SL_State=I时取D ('X', 'B'): 'X', # 自定义规则 ('Y', 'C'): 'CustomResult', # 自定义规则 # ... 继续添加剩下的组合规则 } # 定义函数来匹配规则 def get_sl_value(row): # 先处理SL_Local为空的通用规则 if pd.isna(row['SL_Local']): return row['SL_State'] # 查字典,找不到匹配的话默认返回SL_Local(可以根据需求改默认) return rule_dict.get((row['SL_Local'], row['SL_State']), row['SL_Local']) # 生成新列 df['SL'] = df.apply(get_sl_value, axis=1)
优势:规则一目了然,像查字典一样直观,适合规则都是明确组合的场景;缺点是apply在处理超大数据集时速度不如numpy.select。
方案3:用pandas.case_when(适合pandas 2.1+版本)
如果你用的是pandas 2.1及以上版本,可以用case_when方法,语法和SQL的CASE WHEN非常像,可读性拉满:
# pandas 2.1+支持该方法 df['SL'] = df.case_when( df['SL_Local'].isna(), df['SL_State'], (df['SL_Local'] == 'D') & (df['SL_State'] == 'I'), 'D', # 继续添加你的其他规则,格式是:条件, 结果 # (df['SL_Local'] == 'X') & (df['SL_State'] == 'B'), 'X', # ... default=df['SL_Local'] )
优势:语法贴近自然语言,写起来像写SQL逻辑,非常好懂;同样适合大数据量,效率和numpy.select差不多。
内容的提问来源于stack exchange,提问作者LMGagne
相关产品推荐
相关产品推荐

