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

Merging pandas dataframes on multiple conditions (python/pandas)

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

我想获得第三个数据帧(df3),它只保留基于 df1 和 df2 之间的 Chr 列的 df1 的行,以及一个位于df2的pos-start和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

一种方法是进行普通的旧合并,然后丢弃超出范围的值:

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