【问题标题】:Match df1 with df2 and Replace it with index value (Not Inner Join)将 df1 与 df2 匹配并将其替换为索引值(非内连接)
【发布时间】:2019-01-22 18:11:50
【问题描述】:

我正在寻找匹配 df1 中的值并将其替换为 df1 中 df2 的索引。

例如

输入df1

Column1
Test1
Test2
Test1, Test2

输入 df2

Index ColumnA
0     Test1
1     Test2

所以,我期待的最终输出是

输出df1

Column1
0
1
0, 1

由于性能问题,我不喜欢迭代 df1 中的每一行值并替换,但是有没有可以做到这一点的函数?

请帮我解决这个问题。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这似乎是replace 问题;你可以传递字典。

    df1['Column1'].replace(
        dict(zip(df2['ColumnA'], df2['Index'].astype(str))), regex=True)
    
    0       0
    1       1
    2    0, 1
    Name: Column1, dtype: object
    

    如果您需要考虑子字符串(IOW,防止匹配较大字符串的子字符串),您可以为每个模式添加单词边界。

    df1 = pd.DataFrame({'Column1': ['Test1', 'Test2', 'Test1, Test2', 'Test12']})
    df1
    
            Column1
    0         Test1
    1         Test2
    2  Test1, Test2
    3        Test12
    
    m = {rf'\b{x}\b': str(y) for x, y in zip(df2['ColumnA'], df2['Index'])}
    df1['Column1'].replace(m, regex=True)
    
    0         0
    1         1
    2      0, 1
    3    Test12
    Name: Column1, dtype: object
    

    【讨论】:

    • 当你有像 Test12 这样的值时,这个答案会失败。它最终将 'Test12' 的 'Test1' 替换为 0 并留下 2。所以,它变成了 02。
    • @Sid29 好的,这是要求吗?可以修复。
    • 是的,这是一个要求 - 它必须完全匹配字符串。
    • 不,它仍然失败。它给了我和以前一样的输出。
    • @Sid29 我认为您没有正确尝试(或者您可能忘记保存,这是初学者的常见错误)。我什至在我的回答中添加了一个示例。
    【解决方案2】:

    get_dummies尝试不同的东西

    x=df1.Column1.str.get_dummies(',').rename(columns=dict(zip(df2.ColumnA,df2.Index)))
    x.dot(x.columns.astype(str)+',').str[:-1]
    Out[23]: 
    0      0
    1      1
    2    0,1
    dtype: object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多