基于第二个DataFrame替换Pandas列值(已尝试StackOverflow方案无效)
解决DataFrame按User_ID替换列值的问题
嘿,我明白你遇到的麻烦了——尝试了两种方法都没成功,确实挺让人头疼的。先帮你梳理下之前两种方法的问题,再给你靠谱的解决方案:
先明确你的数据情况
先把你的示例数据用代码还原下,方便大家理解:
import pandas as pd import numpy as np df1 = pd.DataFrame({ 'User_ID': [123, 345, 567], 'Code_1': ['htrh', np.nan, 'cewr'] }) df2 = pd.DataFrame({ 'User_ID': [123, 345], 'Code_2': ['ert', 'nad'] })
为什么你之前的方法无效?
第一种方法:
df1['Code_1'] = df1['User_ID'].replace(df2.set_index('User_ID')['Code_2'])
这里你是对User_ID列执行replace操作,把User_ID的值替换成Code_2,然后赋值给Code_1,逻辑完全错了,自然得不到想要的结果。第二种方法:
df1.loc[df1.User_ID.isin(df2.User_ID), ['Code_1']] = df2[['Code_2']]
这个方法的问题在于索引不匹配:df2的行索引是0、1,而df1中匹配的User_ID对应的行索引可能和df2不一致(比如如果df1的顺序调整,就会直接赋值错误),pandas的赋值是按索引对齐的,所以会导致替换失败。
正确的解决方案
这里给你两种简单可靠的方法:
方法1:使用map + fillna
先把df2转换成User_ID到Code_2的映射关系,然后用df1的User_ID去匹配,最后保留原有的Code_1值(df2中没有的User_ID就不替换):
# 构建User_ID到Code_2的映射字典 code_map = df2.set_index('User_ID')['Code_2'] # 用map匹配对应值,没有匹配到的用原Code_1填充 df1['Code_1'] = df1['User_ID'].map(code_map).fillna(df1['Code_1'])
执行后df1的结果就是:
| User_ID | Code_1 |
|---|---|
| 123 | ert |
| 345 | nad |
| 567 | cewr |
方法2:使用merge合并后赋值
先把两个DataFrame按User_ID左连接,然后用Code_2替换Code_1,没有匹配到的保留原值:
# 左连接两个DataFrame,保留df1的所有行 merged_df = df1.merge(df2, on='User_ID', how='left') # 替换Code_1:优先用Code_2的值,没有的话保留原Code_1 df1['Code_1'] = merged_df['Code_2'].combine_first(merged_df['Code_1'])
这个方法更直观,适合需要查看中间合并结果的场景。
这两种方法都能完美解决你的需求,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者jeangelj
相关产品推荐
相关产品推荐

