【问题标题】:find a value from df1 in df2 and replace other values of the matching rows在 df2 中从 df1 中找到一个值并替换匹配行的其他值
【发布时间】:2021-02-18 14:07:26
【问题描述】:

我有以下代码和 2 个数据帧(df1 和 df2)

import pandas as pd

data = {'Name': ['Name1', 'Name2', 'Name3', 'Name4', 'Name5'],
        'Number': ['456', 'A977', '132a', '6783r', '868354']}

replace = {'NewName': ['NewName1', 'NewName3', 'NewName4', 'NewName5', 'NewName2'],
        'ID': ['I753', '25552', '6783r', '868354', 'A977']}


df1 = pd.DataFrame(data, columns = ['Name', 'Number'])
df2 = pd.DataFrame(replace, columns = ['NewName', 'ID'])

现在我想将 df1 的“数字”列中的每个项目与 df2 的“ID”列进行比较。如果匹配,我想将 df1 的“名称”替换为 df2 的“新名称”,否则应保留 df1 的“名称”。

首先我尝试了以下代码,但不幸的是它在不同的行中混合了名称和数字。

df1.loc[df1['Number'].isin(df2['ID']), ['Name']] = df2.loc[df2['ID'].isin(df1['Number']),['NewName']].values

我尝试的下一个代码工作得更好一些,但如果没有匹配,它将 df1 的“名称”替换为 df1 的“编号​​”。

df1['Name'] = df1['Number'].replace(df2.set_index('ID')['NewName'])

如何在我的上一个代码中阻止这种行为,或者一般有更好的方法来实现我想做的事情?

【问题讨论】:

    标签: pandas dataframe replace compare


    【解决方案1】:

    您可以使用map 而不是replacedf1Number 列中的每个值替换为df2NewName 列中的相应值,然后将fill 替换为NaN(无法替换的值) 在映射列中使用来自df1 中的Name 列的原始值:

    df1['Name'] = df1['Number'].map(df2.set_index('ID')['NewName']).fillna(df1['Name'])
    

    >>> df1
    
           Name  Number
    0     Name1     456
    1  NewName2    A977
    2     Name3    132a
    3  NewName4   6783r
    4  NewName5  868354
    

    【讨论】:

    • 谢谢您的回答...我尝试了您的解决方案,它对某些数据帧非常有效...但是对于很长的数据帧,我收到以下错误消息...您知道什么吗这意味着以及如何解决它? in get_indexer raise InvalidIndexError( pandas.errors.InvalidIndexError: Reindexing only valid with uniquely valued Index objects
    • 如果df2 包含ID 列中的重复值,那么我想您会收到该错误。解决此问题的一个方法是删除ID 列中的重复值在df2 之前映射df1['Number'].map(df2.drop_duplicates('ID').set_index('ID')['NewName']).fillna(df1['Name'])
    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多