通过搜索和匹配完全相同的字符串来连接两个数据框
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 之间的匹配,但它们在我的数据集中是不同的。
我想要的输出:
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
df2 的 Column2 为每个 full word 获取一行并执行简单的 left 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')
)
输出:
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
另类
注意。我在上面生成了一个略有不同的输出以保留所有列。如果您真的想要输出,只需将“Column2”放入 df1 并将“Column1”重命名为 df2
中的“Column2”
(df1
.drop(columns='Column2')
.merge(df2.rename(columns={'Column1': 'Column2'})
.assign(Column1=df2['Column1'].str.split(','))
.explode('Column1'),
on='Column1', how='left'
)
)
输出:
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
我有两个 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 之间的匹配,但它们在我的数据集中是不同的。 我想要的输出:
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
df2 的 Column2 为每个 full word 获取一行并执行简单的 left 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')
)
输出:
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
另类
注意。我在上面生成了一个略有不同的输出以保留所有列。如果您真的想要输出,只需将“Column2”放入 df1 并将“Column1”重命名为 df2
中的“Column2”(df1
.drop(columns='Column2')
.merge(df2.rename(columns={'Column1': 'Column2'})
.assign(Column1=df2['Column1'].str.split(','))
.explode('Column1'),
on='Column1', how='left'
)
)
输出:
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