如何根据 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]
})
我有 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]
})