我在stackoverflow上经历了所有类似的问题,但解决方案仍然不适合我。
我有两个dfs:
df1:
User_ID | Code_1
123 htrh
345 NaN
567 cewr
...
df2:
User_ID | Code_2
123 ert
345 nad
我想基于User_ID将df1.Code_1替换为df2.Code_2。请注意,df2是df1的user_ids的子集。
我试过这个
df1['Code_1'] = df1['User_ID'].replace(df2.set_index('User_ID')['Code_2'])
我试过这个
df1.loc[df1.User_ID.isin(df2.User_ID), ['Code_1']] = df2[['Code_2']]
并且两者都没有奏效。没有任何改变。
预期产出:
df1:
User_ID | Code_1
123 ert
345 nad
567 cewr
...
谢谢
答案 0 :(得分:2)
使用DataFrame.update
。在调用函数之前,id列(User_ID
)和代码列(Code_1
,Code_2
)在数据框架中应具有相同的名称。
df2.columns = ['User_ID', 'Code_1']
df1.update(df2)
这对你的情况应该足够了。有关其他用途,请参阅documentation
答案 1 :(得分:2)
您可以使用combine_first
df2.set_index('User_ID').Code_2.combine_first(df1.set_index('User_ID').Code_1)
User_ID
123 ert
345 nad
567 cewr
答案 2 :(得分:1)
您可以使用pd.Series.map
+ pd.Series.fillna
。
df1['Code_1'] = df1['User_ID'].map(df2.set_index('User_ID')['Code_2'])\
.fillna(df1['Code_1'])
print(df1)
# User_ID Code_1
# 0 123 ert
# 1 345 nad
# 2 567 cewr
我们的想法是在执行映射时对齐索引,如果df2
中不存在映射,则填充原始值。