在Python/R中匹配DataFrame的ID并更新对应values值的方法
嘿,我太懂你这种用for循环绕半天还搞不定的痛苦了!其实pandas早就给咱们准备好高效的方法了,完全不用费劲写循环,直接用内置的矢量化操作就能轻松搞定需求~
下面给你两种最常用的解决方案,都是针对“用df2匹配ID更新df1的values”这个场景的:
方法1:用update()快速匹配更新
这个方法最直接,原理是先把两个DataFrame的索引设为ID(用来精准匹配),然后用update()只覆盖匹配到的行:
import pandas as pd # 先模拟你的两个DataFrame(你可以替换成自己的真实数据) df1 = pd.DataFrame({'ID': [1, 2, 3, 4], 'values': [10, 20, 30, 40]}) df2 = pd.DataFrame({'ID': [2, 4], 'values': [200, 400]}) # 把两个df的索引都设为ID,方便匹配 df1.set_index('ID', inplace=True) df2.set_index('ID', inplace=True) # 执行更新:只会替换df1中与df2ID匹配的values值,不匹配的保留原数据 df1.update(df2) # 如果需要把ID从索引变回普通列,就重置索引 df1.reset_index(inplace=True)
运行完之后,df1就变成你想要的New_df1啦~
方法2:用map()字典映射更新
如果你的df2里的ID都是唯一的,用字典映射的方式更简洁:
# 先把df2转换成{ID: values}的字典 value_mapping = df2.set_index('ID')['values'].to_dict() # 用map匹配ID,匹配到就替换values,没匹配到的用fillna保留原数值 df1['values'] = df1['ID'].map(value_mapping).fillna(df1['values'])
这个方法代码更短,处理小数据集的时候特别顺手。
为啥你的for循环+append没用?
其实append是用来添加新行的,而你要做的是修改已有行的列值,方向完全不对哦~而且循环处理DataFrame本身就不符合pandas的设计逻辑,不仅容易出错,处理大数据的时候速度还特别慢,以后尽量用矢量化操作就对啦!
内容的提问来源于stack exchange,提问作者Alice_inwonderland
相关产品推荐
相关产品推荐

