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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:03:19