在多个条件下合并 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
我有一个 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