我有两个:其中一个有一个列有一个'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 上面是dataset1的AC-2和dataset 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和完全相同的东西合并。
谢谢你的贡献!
发布于 2022-01-06 07:29:52
一种简单的方法是split和explode ( Column2 of df2 )为整字获取一行,并执行简单的左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-30https://stackoverflow.com/questions/70598075
复制相似问题