我有两个带有许多列的数据框,每个数据框都有可用于联接的列ID(SQL内部联接类型可以接受多个匹配项)。在输出中,我需要具有来自两个数据框的所有列的数据框,因此我想使用pd.merge。棘手的部分是,无法通过简单比较ID_1 = ID_2来完成连接,而只能在公共子字符串上完成。这是数据示例的样子(所有数据类型都是字符串)以及预期的结果:
我试图找到ID_1和ID_2之间的交集,然后在pd.merge中的left_on / right_on条件下使用它。这是我尝试过的:
创建两个数据框的示例:
df_1 = pd.DataFrame({'ID_1': ['[COL_63334]', '[COL_63339, DNB_64268]', '[COL_67319, COL_94485]', '[COL_76540]', '[DNB_35923, DNB_23999, COL_30000]']})
df_2 = pd.DataFrame({'ID_2': ['[COL_63334, COL_63335, COL_63337, DNB_64268]', '[COL_63335, COL_63338, DNB_64268]', '[COL_94485]', '[COL_98341, COL_23144]', '[COL_5600, DNB_35923, DNB_36999, COL_30000]']})
将数据转换为列表:
df_1['ID_1'] = df_1.ID_1.apply(lambda x: x[1:-1].split(', '))
df_2['ID_2'] = df_2.ID_2.apply(lambda x: x[1:-1].split(', '))
通过以下方式查找两个列表的交集:
df_1['intersect'] = set(df_1.ID_1).intersection(df_2.ID_2)
通过以下方式查找两个列表的交集:
[x for x in df_1.ID_1 if x in df_2.ID_2]
找到交集的两种方法均返回此错误: TypeError:无法散列的类型:“列表”