[英]Join two data frames by searching & matching exactly same strings
我有两个 python 数据帧:其中一个有一个列有一个行'AC-2'另一个数据帧包括有一个字符串行'AC-20,AC8,AC-15'的列
str_match = "({})".format("|".join(df1['column_first_dataframe']))
df2.merge(df2,how='left',left_on=df1['column_first_dataframe'].str.extract(str_match)[0], right_on="column_second_dataframe")
第一个数据集:
Column1 Column2
AC-2 2
AC-20 1
AC-15 3
AC-1 2
AC-5 5
第二个数据集:
Column1
AC-2,AC-5,AC-30
AC-20,AC-30,AC11
我发现:
Column1 Column2
AC-2 AC-20,AC-30,AC11
AC-2 AC-2,AC-5,AC-30
AC-20 AC-20,AC-30,AC11
AC-15 null
AC-1 null
AC-5 AC-2,AC-5,AC-30
上面有数据集 1 的 AC-2 和数据集 2 的字符串中的 AC-20 之间的匹配,但它们在我的数据集中是不同的东西。 我想要的 output:
Column1 Column2
AC-2 AC-2,AC-5,AC-30
AC-20 AC-20,AC-30,AC11
AC-15 null
AC-1 null
AC-5 AC-2,AC-5,AC-30
我试图通过搜索和匹配来合并数据帧,但我的代码将 AC-2 合并到 AC-20。 我不想那样做。 是否有任何搜索和匹配方法可以完全合并我想要的数据框。 我不想合并 AC-20 和 AC-2。 它应该将 AC-2 和 AC-2 与完全相同的东西合并。
感谢您的贡献!
一种简单的方法是split
和分解explode
的 Column2 以获得每个完整单词的一行并执行简单的左merge
。
(df1
.merge(df2.assign(group=df2['Column1'].str.split(','))
.rename(columns={'Column1': 'Column3'})
.explode('group'),
left_on='Column1', right_on='group', how='left'
)
.drop(columns='group')
)
output:
Column1 Column2 Column3
0 AC-2 2 AC-2,AC-5,AC-30
1 AC-20 1 AC-20,AC-30,AC11
2 AC-15 3 NaN
3 AC-1 2 NaN
4 AC-5 5 AC-2,AC-5,AC-30
注意。 我正在生产稍有不同的 output 以保留所有列。 如果你真的想要你的 output,只需在 df1 中删除“Column2”,然后在 df2 中将“Column1”重命名为“Column2”
(df1
.drop(columns='Column2')
.merge(df2.rename(columns={'Column1': 'Column2'})
.assign(Column1=df2['Column1'].str.split(','))
.explode('Column1'),
on='Column1', how='left'
)
)
output:
Column1 Column2
0 AC-2 AC-2,AC-5,AC-30
1 AC-20 AC-20,AC-30,AC11
2 AC-15 NaN
3 AC-1 NaN
4 AC-5 AC-2,AC-5,AC-30
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.