我有一个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
答案 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