如何按指定顺序更新Pandas DataFrame某列的多条记录?
问题与解决方法
问题场景
现有如下Pandas DataFrame,key列均为唯一字符串:
import pandas as pd df = pd.DataFrame({'key':['b','d','c','a','e','f'], 'value': [0,0,0,0,0,0]})
输出:
key value 0 b 0 1 d 0 2 c 0 3 a 0 4 e 0 5 f 0
同时有两组对应数据:
keys = ['a', 'b', 'c', 'd'] values = [1, 2, 3, 4]
需求是按a→1、b→2、c→3、d→4的对应关系更新value列,但使用df.loc[df['key'].isin(keys),'value'] = values后得到错误结果:
key value 0 b 1 1 d 2 2 c 3 3 a 4 4 e 0 5 f 0
期望得到的正确结果:
key value 0 b 2 1 d 4 2 c 3 3 a 1 4 e 0 5 f 0
错误原因
df['key'].isin(keys)返回的布尔筛选结果是按原DataFrame的行顺序匹配的,筛选出的行顺序是b、d、c、a,而赋值的values是[1,2,3,4],Pandas会直接按筛选出的行顺序依次赋值,导致键值对应关系错位。
解决方法
方法1:字典映射(最直观)
将keys和values转为字典,用map匹配键值,保留未匹配的原始值:
key_value_dict = dict(zip(keys, values)) df['value'] = df['key'].map(key_value_dict).fillna(df['value'])
map会根据key列的值从字典中提取对应数值,未匹配到的键会返回NaNfillna(df['value'])把NaN替换为原列的0值,保留未更新行的数据
方法2:利用索引匹配更新
创建以keys为索引的Series,通过索引精准匹配赋值:
update_series = pd.Series(values, index=keys) df['value'] = df['key'].replace(update_series)
replace会自动将key列的值替换为update_series中对应索引的数值,未匹配的值保持不变
方法3:临时设置索引赋值
将key列设为临时索引,按keys顺序精准赋值后恢复原索引:
df = df.set_index('key') df.loc[keys, 'value'] = values df = df.reset_index()
- 设置
key为索引后,loc[keys]会严格按照keys的顺序找到对应的行,赋值values时不会错位 - 最后用
reset_index()恢复原有的整数索引
以上三种方法都能得到你期望的正确结果。
内容的提问来源于stack exchange,提问作者Shaun Han
相关产品推荐
相关产品推荐

