如何根据 python 中的字符串搜索合并两个 pandas 数据框?

How to merge two pandas dataframe based on string search in python?

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

提前感谢您的宝贵时间!

第一个数据帧

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

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

示例:

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)

在每个 DataFrame 中使用 groupby cumcount 枚举 Item 以允许合并内的位置对齐:

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]
})