如何在pandas中对齐dfs

时间:2015-10-29 10:17:32

标签: python pandas

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

 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])

但它没有用。

1 个答案:

答案 0 :(得分:1)

我打印出了df和df2,因此您可以确认这些是您正在使用的数据框架。

>>> 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个令牌。所以,我认为你的意思是相反。把如何='对'在联接中将以另一种方式执行。