如何基于字典映射以向量化方式批量替换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
相关产品推荐
相关产品推荐

