首页 > 解决方案 > pandas - 在包含元组的列上合并

问题描述

我有一个这样的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 个 dfs 来生成一个 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 后,我已经完成ast.literal_eval了这两个 df 的列。两个 dfs 也不共享共同索引。

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

标签: pythonpython-3.xpandasdataframedata-manipulation

解决方案


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

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)  

推荐阅读