一个接一个地合并一个键

时间:2015-12-02 12:18:15

标签: python-2.7 pandas

我经常遇到以下情况。我有一个带有两个ID的数据框

A = pd.DataFrame([[1,'a', 'a1'], [2, None, 'a2'], [3,'c', 'a3'], [4,'None', 'a3'], [None, 'e', 'a3'], ['None', 'None', 'None']], columns = ['id1', 'id2', 'colA'])

    id1   id2  colA
0     1     a    a1
1     2  None    a2
2     3     c    a3
3     4  None    a3
4  None     e    a3
5  None  None  None

我还有另一个数据框,其中包含我想要添加到第一个数据框的其他信息

B = pd.DataFrame([[1,'a', 'b1', 'c1'], [2, 'b', 'b2', 'c2'], [3,'c', 'b3', 'c3'], [4, 'd', 'b4', 'c4'], [5, 'e', 'b5', 'c5'], [6, 'e', 'b5', 'c5']], columns = ['id1', 'id2', 'colB', 'colC'])
Out[15]: 
id1 id2 colB colC
0    1   a   b1   c1
1    2   b   b2   c2
2    3   c   b3   c3
3    4   d   b4   c4
4    5   e   b5   c5
5    6   e   b5   c5

我想在id1上合并,就像这样     A.merge(B,how ='left',on ='id1')

      id1 id2_x  colA id2_y colB colC
0     1     a    a1     a   b1   c1
1     2  None    a2     b   b2   c2
2     3     c    a3     c   b3   c3
3     4  None    a3     d   b4   c4
4  None     e    a3   NaN  NaN  NaN
5  None  None  None   NaN  NaN  NaN

这接近我想要的。但是对于失败的查找(即id1不可用时)我想在id2上合并,所以结果看起来像

      id1 id2_x  colA id2_y colB colC
0     1     a    a1     a   b1   c1
1     2  None    a2     b   b2   c2
2     3     c    a3     c   b3   c3
3     4  None    a3     d   b4   c4
4  None     e    a3   NaN   b5   c5
5  None  None  None   NaN  NaN  NaN

实现这一目标的最佳方法是什么?注意我不希望结果中有2个id2列,而id2可能有重复项。

1 个答案:

答案 0 :(得分:1)

您使用fillna的IIUC。但它也填补了最后一行。

 print df
    id1 id2_x  colA id2_y colB colC
0     1     a    a1     a   b1   c1
1     2  None    a2     b   b2   c2
2     3     c    a3     c   b3   c3
3     4  None    a3     d   b4   c4
4  None     e    a3   NaN  NaN  NaN
5  None  None  None   NaN  NaN  NaN


df = df.fillna(B)
print df
    id1 id2_x  colA id2_y colB colC
0     1     a    a1     a   b1   c1
1     2  None    a2     b   b2   c2
2     3     c    a3     c   b3   c3
3     4  None    a3     d   b4   c4
4  None     e    a3   NaN   b5   c5
5  None  None  None   NaN   b5   c5

正如EdChum在评论中提到的,下一个解决方案是使用combine_first,但输出是不同的:

print A.combine_first(B)
   colA colB colC   id1   id2
0    a1   b1   c1     1     a
1    a2   b2   c2     2     b
2    a3   b3   c3     3     c
3    a3   b4   c4     4  None
4    a3   b5   c5     5     e
5  None   b5   c5  None  None

区别在于:

In [142]: %timeit A.combine_first(B)
100 loops, best of 3: 3.44 ms per loop

In [143]: %timeit A.merge(B, how='left', on='id1').fillna(B)
100 loops, best of 3: 2.89 ms per loop