Pandas根据字典匹配列更新值 无匹配项时保留原有列值
实现方法
直接用map搭配fillna即可实现需求,代码如下:
df['Pack_Size'] = df['Product_ID'].map(pack_size_dict).fillna(df['Pack_Size'])
实现逻辑:
df['Product_ID'].map(pack_size_dict)会优先匹配字典中存在的Product_ID,返回对应的Pack_Size值,匹配不到的条目统一返回NaN- 后续的
fillna(df['Pack_Size'])会把所有NaN位置,用当前行原有的Pack_Size值填充,不会改动未匹配条目的原有内容
可选写法
如果更倾向于「仅对匹配到的条目做赋值」的显式逻辑,也可以用mask方法实现:
# 仅当Product_ID存在于字典键中时,才替换Pack_Size为字典对应值 df['Pack_Size'] = df['Pack_Size'].mask( df['Product_ID'].isin(pack_size_dict.keys()), df['Product_ID'].map(pack_size_dict) )
注意事项
你当前定义的pack_size_dict键全部为字符串类型,如果DataFrame中Product_ID列存储的是整数/数值类型,会出现全部匹配失败的问题,使用前需要先统一数据类型,二选一即可:
- 把列转为字符串类型:
df['Product_ID'] = df['Product_ID'].astype(str) - 把字典键转为整数类型:
pack_size_dict = {int(k):v for k,v in pack_size_dict.items()}
内容的提问来源于stack exchange,提问作者AmanArora
相关产品推荐
相关产品推荐

