根据第二个df替换python pandas列中的值

时间:2018-04-05 15:32:10

标签: python pandas replace syntax

我在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
    ...

谢谢

3 个答案:

答案 0 :(得分:2)

使用DataFrame.update。在调用函数之前,id列(User_ID)和代码列(Code_1Code_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中不存在映射,则填充原始值。