pandas - 在包含元组的列上合并

pandas - merge on a column with tuples

我有一个这样的 df:

>>> df1

        col_1   col_2    labels
0        aaa     abc     (71020,)
1        ddd     ghi     (99213, 99287,)
2        bbb     cde     (77085,)
3        eee     ijk     (99233, 71020, 36415,)

还有一个像这样的 df:

>>> df2

   71020  77085  36415  99213  99287  99233  labels_mg
0    1      0      1      0      0      1     (99233, 71020, 36415,)
1    1      0      0      0      0      0     (71020,)
2    0      0      0      1      1      0     (99213, 99287)
3    0      1      0      0      0      0     (77085,)

并希望通过右连接以上 2 个 df 来生成一个 df,如下所示:

        col_1   col_2    labels                     71020  77085  36415  99213  99287  99233
0        aaa     abc     (71020,)                    1      0      0      0      0      0
1        ddd     ghi     (99213, 99287,)             0      0      0      1      1      0
2        bbb     cde     (77085,)                    0      1      0      0      0      0
3        eee     ijk     (99233, 71020, 36415,)      1      0      1      0      0      1 

这是我尝试过的方法,但这会生成一个包含 0 行的空数据框,但包含所有列名。

pd.merge(left=df1, right=df2, left_on=['labels'], right_on=['labels_mg'])

元组在两个 dfs 中都被解析为元组。从文件读取到 pandas dfs 后,我在这两个 df 的列上完成了 ast.literal_eval。两个 dfs 也不共享公共索引。

我的 df 大小是 (528840, 207) 和 (528840, 5)。我如何有效地做到这一点?

问题一元组是整数,第二个元组由字符串填充,解决方案是将它们转换为整数,如:

import ast

df1['labels'] = df1['labels'].apply(ast.literal_eval)
df2['labels_mg'] = df2['labels_mg'].apply(lambda x: tuple([int(y) for y in ast.literal_eval(x)]))
    
df = pd.merge(left=df1, right=df2, left_on=['labels'], right_on=['labels_mg'])
print (df)
  col_1 col_2                 labels  71020  77085  36415  99213  99287  \
0   aaa   abc               (71020,)      1      0      0      0      0   
1   ddd   ghi         (99213, 99287)      0      0      0      1      1   
2   bbb   cde               (77085,)      0      1      0      0      0   
3   eee   ijk  (99233, 71020, 36415)      1      0      1      0      0   

   99233              labels_mg  
0      0               (71020,)  
1      0         (99213, 99287)  
2      0               (77085,)  
3      1  (99233, 71020, 36415)