【问题标题】:How to merge two pandas dataframe based on string search in python?python - 如何基于python中的字符串搜索合并两个熊猫数据框?
【发布时间】:2021-11-28 19:21:30
【问题描述】:

我有 2 个以下数据框。我想合并“项目”列上的两个数据框,下面是我的预期输出和代码。但是,pandas 代码下方显示重复行,如下所示。不知道代码有什么问题?我在想可能我必须在“项目”列上进行字符串搜索,然后合并数据框。但是,我不确定如何实现这一目标?请提供代码解释。

提前感谢您的宝贵时间!

第一个数据帧

Item               ID
ABC                1
ABC                2
ABC                3
CD                 12
EF                 11

第二个数据帧

Name      Item         Price
Name1     ABC           123.00
Name2     ABC           110
Name 3    ABC           100
Name4      CD           50

预期输出

Name      Item        ID     Price
Name1     ABC          1    123.00
Name2     ABC          2     110
Name 3    ABC          3     100
 Name4    CD           12    50

代码

pd.merge(df1,df2,on="Item",how='outer')

上面的代码显示在输出下面

    Item    ID  Name    Price
0   ABC 1   Name1   123.0
1   ABC 1   Name2   110.0
2   ABC 1   Name3   100.0
3   ABC 2   Name1   123.0
4   ABC 2   Name2   110.0
5   ABC 2   Name3   100.0
6   ABC 3   Name1   123.0
7   ABC 3   Name2   110.0
8   ABC 3   Name3   100.0
9   CD  12  Name4   50.0
10  EF  11  NaN     NaN

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    在每个 DataFrame 中枚举 Itemgroupby cumcount 以允许在合并中进行位置对齐:

    df3 = pd.merge(
        df1, df2,
        left_on=['Item', df1.groupby('Item').cumcount()],
        right_on=['Item', df2.groupby('Item').cumcount()]
    )
    

    df3:

      Item  key_1  ID    Name  Price
    0  ABC      0   1   Name1  123.0
    1  ABC      1   2   Name2  110.0
    2  ABC      2   3  Name 3  100.0
    3   CD      0  12   Name4   50.0
    

    可以添加drop 来移除这个添加的合并键列:

    df3 = pd.merge(
        df1, df2,
        left_on=['Item', df1.groupby('Item').cumcount()],
        right_on=['Item', df2.groupby('Item').cumcount()]
    ).drop(columns='key_1')
    

    df3:

      Item  ID    Name  Price
    0  ABC   1   Name1  123.0
    1  ABC   2   Name2  110.0
    2  ABC   3  Name 3  100.0
    3   CD  12   Name4   50.0
    

    设置和导入:

    import pandas as pd
    
    df1 = pd.DataFrame({
        'Item': ['ABC', 'ABC', 'ABC', 'CD', 'EF'],
        'ID': [1, 2, 3, 12, 11]
    })
    
    df2 = pd.DataFrame({
        'Name': ['Name1', 'Name2', 'Name 3', 'Name4'],
        'Item': ['ABC', 'ABC', 'ABC', 'CD'],
        'Price': [123.00, 110, 100, 50]
    })
    

    【讨论】:

      【解决方案2】:

      我能想到的最简单的方法是在输入数据帧中添加另一列来模拟索引 [0, 1, 2, 3...]。即使“项目”被复制,这也会产生一个唯一的条目,并导致正确的合并。

      例子:

      import pandas as pd
      
      A = [[1, 2, 3, 4], ['A', 'A', 'B', 'C'], [0, 1, 2, 3]]
      B = [[10, 20, 30, 40], ['A', 'A', 'B', 'C'], [0, 1, 2, 3]]
      
      df = pd.DataFrame(A).T
      df.columns = ['Val', 'ID', 'IDX']
      print(df)
      
      df2 = pd.DataFrame(B).T
      df2.columns = ['Other', 'ID', 'IDX']
      print(df2)
      
      M = pd.merge(df, df2)
      print(M)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-30
        • 2020-08-16
        • 2018-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-03
        相关资源
        最近更新 更多