使用两列中的数据作为reqs连接两个pandas数据帧的特定行

时间:2017-05-09 21:06:24

标签: python python-3.x pandas

我有两个数据帧DF1和DF2,其中

都具有子帧“数据”和“元数据”,并且DF1具有比DF2

多得多的行
DF1 
     DATA            METADATA
     0 1 2 3 4 5     attr1      attr2        ..  attrN
11   1 1 1 1 1 1     000        apple
13   1 1 1 1 1 1     140        orange
19   1 1 1 1 1 1     199        pineapple
25   1 5 1 1 1 2     000        apple
..

DF2 
     DATA        METADATA
     x y z k     attr1      attr2            ..  attrK
000  2 2 2 2     000        bean
001  2 2 2 2     001        bean
002  2 2 2 2     002        bean
003  2 2 2 2     003        bean
..
199  2 2 2 2     199        bean
200  2 2 2 2     000        orange
201  2 2 2 2     001        orange
..
340  1 2 3 4     140        orange
..
500  4 3 2 1     000        apple
..
700  2 2 2 2     350        bread
..
999  5 5 5 5     199        pineapple

我想基于DF2中的属性将DF2中的列式特定行连接到DF1中的行。

具体做法是:

对于DF1中的每一行,我想只连接DF2中行的DATA,以便DF1.METADATA.attr1&中的条目。 DF2.METADATA.attr1和DF1.METADATA.attr2& DF2.METADATA.attr2对于每一行都是相同的。结果如下:

 DF3 (desired result)
       DATA                  METADATA
       0 1 2 3 4 5 x y z k   attr1       attr2       .. attr N
 11    1 1 1 1 1 1 4 3 2 1   000         apple
 13    1 1 1 1 1 1 1 2 3 4   140         orange
 19    1 1 1 1 1 1 5 5 5 5   199         pineapple
 25    1 5 1 1 1 2 4 3 2 1   000         apple

我已经设法通过循环来完成它,但是我得到了一个糟糕的运行时并且需要大量数据才能让它运行得更快并且应该有一种通过熊猫快速简单地完成此操作的方法(我想! )

1 个答案:

答案 0 :(得分:0)

听起来你想在attr1上进行合并,例如:

df1.merge(df2, how='left')

例如(略微调整):

In [11]: df1
Out[11]:
   DATA                METADATA
      0  1  2  3  4  5    attr1      attr2
11    1  1  1  1  1  1        0       bean
13    1  1  1  1  1  1      140     orange
19    1  1  1  1  1  1      199  pineapple
25    1  5  1  1  1  2        0      apple

In [12]: df2
Out[12]:
  DATA          METADATA
     x  y  z  k    attr1  attr2
0    2  2  2  2        0   bean
1    7  2  2  2        0  apple
2    2  2  2  2        2   bean
3    7  2  2  2        3   bean

In [13]: df1.merge(df2, how="left")
Out[13]:
  DATA                METADATA            DATA
     0  1  2  3  4  5    attr1      attr2    x    y    z    k
0    1  1  1  1  1  1        0       bean  2.0  2.0  2.0  2.0
1    1  1  1  1  1  1      140     orange  NaN  NaN  NaN  NaN
2    1  1  1  1  1  1      199  pineapple  NaN  NaN  NaN  NaN
3    1  5  1  1  1  2        0      apple  7.0  2.0  2.0  2.0

注意:这将合并到共享列,在本例中为METADATA attr1和attr2。请参阅merge section of the docs