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

如何基于字典映射以向量化方式批量替换DataFrame多列值?

问题与解决方案

问题场景

现有如下DataFrame:

df = DataFrame(data={'ID': ['a','b','c','d'], 'col1':[1,2,3,4], 'col2':[5,6,7,8], 'col3':[9,10,11,12]})

以及映射字典:

mapper = {'a':100,'d':3}

需要实现:当ID列的值匹配字典的键时,替换对应行的col1和col3的值。当前通过for循环实现,但数据量较大时效率低下,寻求向量化实现方式。

向量化实现方案

方案1:利用Series.map() + fillna()

# 对col1执行映射替换,未匹配项保留原值
df['col1'] = df['ID'].map(mapper).fillna(df['col1'])
# 对col3执行相同操作
df['col3'] = df['ID'].map(mapper).fillna(df['col3'])

原理:map()会按ID的值匹配mapper的键,返回对应值;未匹配项返回NaN,再通过fillna()将NaN替换为原列的原始值,全程为向量化操作,避免循环开销。

方案2:使用DataFrame.replace()批量指定列映射

# 直接为col1和col3指定映射规则,原地更新
df.replace({'col1': mapper, 'col3': mapper}, inplace=True)

原理:replace()支持传入字典结构,键为列名,值为该列的映射规则,内部采用向量化逻辑处理,代码更简洁。

方案3:布尔索引批量更新

# 筛选出ID在mapper键中的行
mask = df['ID'].isin(mapper.keys())
# 获取这些行对应的映射值
replace_values = df['ID'].map(mapper)
# 批量更新col1和col3
df.loc[mask, ['col1', 'col3']] = replace_values.loc[mask].values[:, None]

原理:先通过isin()定位需要更新的行,再提取对应的替换值,最后通过loc一次性完成多列赋值,减少重复索引操作的开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:55:17