在多个条件下合并pandas数据帧(python / pandas)

时间:2015-10-21 03:10:01

标签: python pandas merge dataframe data-manipulation

我有一个Python / Pandas数据帧( df1 ),包含ID,Chr和位置。和由相同类型的数据(ID,Chr,位置), df2 组成的数据框。

我想获得第三个数据帧( df3 ),它只保留基于df1和df2之间的Chr列的df1行,以及位于pos-start和df2的pos-end;另外,它需要添加匹配所源自的ID或行df2。

我觉得这很难,有没有人有想法?

请参阅以下示例:

df1

ID1 Chr pos
a   12  500
b   12  250
c   12  300
d   16  2000
e   16  1050
f   16  1075
d   16  1150
g   17  8000
h   17  550
i   17  500

df2

ID2 Chr pos-start   pos-end
x   12  200      400
y   16  1000    1100
z   16  1070    1200

结果 df3

ID2 ID1 Chr Pos
x   b   12  250
x   c   12  300
y   e   16  1050
y   f   16  1000
z   f   16  1075
z   d   16  1150

1 个答案:

答案 0 :(得分:5)

一种方法是进行普通的旧合并,然后将值丢弃到范围之外:

In [11]: df3 = df1.merge(df2)

In [12]: df3
Out[12]:
   ID1  Chr   pos ID2  pos-start  pos-end
0    a   12   500   x        200      400
1    b   12   250   x        200      400
2    c   12   300   x        200      400
3    d   16  2000   y       1000     1100
4    d   16  2000   z       1070     1200
5    e   16  1050   y       1000     1100
6    e   16  1050   z       1070     1200
7    f   16  1075   y       1000     1100
8    f   16  1075   z       1070     1200
9    d   16  1150   y       1000     1100
10   d   16  1150   z       1070     1200

In [13]: df3[(df3["pos-start"] < df3["pos"]) & (df3["pos"] < df3["pos-end"])]
Out[13]:
   ID1  Chr   pos ID2  pos-start  pos-end
1    b   12   250   x        200      400
2    c   12   300   x        200      400
5    e   16  1050   y       1000     1100
7    f   16  1075   y       1000     1100
8    f   16  1075   z       1070     1200
10   d   16  1150   z       1070     1200

并丢弃您不想要的列:

In [14]: df3[(df3["pos-start"] < df3["pos"]) & (df3["pos"] < df3["pos-end"])][['ID2', 'ID1', 'Chr', 'pos']]
Out[14]:
   ID2 ID1  Chr   pos
1    x   b   12   250
2    x   c   12   300
5    y   e   16  1050
7    y   f   16  1075
8    z   f   16  1075
10   z   d   16  1150