如何用np.where实现DataFrame多列表匹配的多条件赋值?
问题描述
我将美国各州缩写分组为多个列表(示例如下):
list1 = ['TX','FL','OR'] list2 = ['AL','MA','NJ'] list3 = ['WA','PA','GA']
实际有15个列表覆盖全部50个州,此处仅展示3个。现有如下DataFrame df:
State abbrev produce goods service Alabama AL 5 10 15 Texas TX 7 17 27 Florida FL 2 73 13 Georgia GA 12 65 20 New Jersey NJ 65 26 11
需要新增一列final_delivery,规则为:
- 州缩写在list1中,取
produce列的值 - 州缩写在list2中,取
goods列的值 - 州缩写在list3中,取
service列的值
预期结果如下:
State abbrev produce goods service final_delivery Alabama AL 5 10 15 10 Texas TX 7 17 27 7 Florida FL 2 73 13 2 Georgia GA 12 65 20 20 New Jersey NJ 65 26 11 26
此前尝试使用单条np.where语句赋值:
df["final_delivery"] = np.where(df['abbrev'].isin(list1), df['produce'], "")
但后续处理list2、list3的匹配赋值时,已赋值的内容会被替换为空,需解决该问题。
解决方案
方法1:嵌套np.where实现多条件判断
通过多层嵌套np.where,依次对不同列表的州缩写进行判断,避免覆盖已赋值的有效值:
import numpy as np df["final_delivery"] = np.where(df['abbrev'].isin(list1), df['produce'], np.where(df['abbrev'].isin(list2), df['goods'], np.where(df['abbrev'].isin(list3), df['service'], np.nan)))
若存在更多列表,可继续嵌套np.where;最后一个分支的np.nan可替换为你需要的默认值(由于所有州都被覆盖,该分支实际不会触发)。
方法2:构建映射字典(适配多列表场景)
当列表数量多达15个时,嵌套np.where会导致代码冗长,更高效的方式是先构建州缩写→对应列名的映射字典,再通过lookup取值:
# 构建映射字典 state_col_map = {} # 为每个列表的州缩写分配对应列名 for state in list1: state_col_map[state] = 'produce' for state in list2: state_col_map[state] = 'goods' for state in list3: state_col_map[state] = 'service' # 其余12个列表按此逻辑依次添加 # 生成final_delivery列 df['final_delivery'] = df.lookup(df.index, df['abbrev'].map(state_col_map))
这种方式结构清晰,后续维护或修改分组规则时更便捷。
内容的提问来源于stack exchange,提问作者JodeCharger100
相关产品推荐
相关产品推荐

