我有两个数据框。第一个是这样的:

 idx  token   tag   file
 0    This    AA    file_1.1
 1    is      AA    file_1.1
 2    a       AA    file_1.2


第二个就是这样

file
file_1.1    IXX    GXX
file_1.2    AXX
file_1.3    AXX


如何将两者结合在一起,使我具有以下特点:

 idx  token   tag   file        ID
 0    This    AA    file_1.1    IXX
 1    is      AA    file_1.1    GXX
 2    a       AA    file_1.2    AXX


因此,首先我需要按文件列对齐(并且我可以做到这一点),然后如果一行有一个ID,我必须将其添加到ID列中(如果有多个,则将其添加到第一个标记中,然后第二个到第二个令牌,依此类推。每行ID永远不会超过令牌。

我尝试了以下

pandas.concat([df1,df2],axis=1,join_axes=[df1.index])


但这是行不通的。

最佳答案

我打印了df和df2,以便您可以确认这些是您正在使用的DataFrame。

>>> print df
  token tag      file
0  This  AA  file_1.1
1    is  AA  file_1.1
2     a  AA  file_1.2

>>> print df2
            0     1
file
file_1.1  IXX   GXX
file_1.2  AXX  None
file_1.3  AXX  None

>>> a = df.set_index(['file', df.groupby('file').cumcount()])
>>> print a
           token tag
file
file_1.1 0  This  AA
         1    is  AA
file_1.2 0     a  AA

>>> b = df2.stack().to_frame('ID')
>>> print b
             ID
file
file_1.1 0  IXX
         1  GXX
file_1.2 0  AXX
file_1.3 0  AXX

>>> c = a.join(b).reset_index(1, drop=True).reset_index()
>>> print c
       file token tag   ID
0  file_1.1  This  AA  IXX
1  file_1.1    is  AA  GXX
2  file_1.2     a  AA  AXX


请注意,这将是左联接。您说过“每行ID永远不会超过令牌。”,但是在示例中,file_1.3在df2中具有1个ID,在df中具有0个令牌。因此,我认为您的意思是相反的。将how ='right'放入联接中将以另一种方式进行。

关于python - 如何在 Pandas 中对齐DFS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33411466/

10-12 22:03
查看更多