代码之家  ›  专栏  ›  技术社区  ›  jeangelj

基于第二个df替换python熊猫列中的值

  •  1
  • jeangelj  · 技术社区  · 6 年前

    我已经讨论了stackoverflow的所有类似问题,但解决方案仍然不适合我。

    我有两个dfs:

    df1:
    User_ID |    Code_1
    123           htrh
    345           NaN
    567           cewr
    ...
    
    df2:
    User_ID |    Code_2
    123           ert
    345           nad
    

    我想替换df1。用df2编码_1。基于User\u ID编码\u 2。请注意,df2是df1的User\u ID的子集。

    我试过这个

    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 回复  |  直到 6 年前
        1
  •  2
  •   mcard    6 年前

    使用 DataFrame.update .id列( User_ID )和代码列( Code_1 ,则, Code_2 )调用函数之前,应在数据帧中使用相同的名称。

    df2.columns = ['User_ID', 'Code_1']
    df1.update(df2)
    

    这对你的情况应该足够了。有关其他用途,请参阅 documentation

        2
  •  2
  •   Vaishali    6 年前

    您可以先使用combine\u

    df2.set_index('User_ID').Code_2.combine_first(df1.set_index('User_ID').Code_1)
    
    
    User_ID
    123     ert
    345     nad
    567    cewr
    
        3
  •  1
  •   jpp    6 年前

    您可以使用 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