【发布时间】:2020-09-04 14:34:25
【问题描述】:
您好,我有一个数据框,例如:
Df1
Groups Names COLs COLe
G1 ABC_DEF.1:2-300():Canis_lupus 2 300
G1 SEQUENCE1 NA NA
G1 SEQUENCE2 NA NA
G1 SEQUENCE3 NA NA
G1 ABC_DEF.1:400-600():Canis_lupus 400 600
G1 IJK_LMN.1:20-200():Bos_taurus 20 200
G2 OP_D:500-1000():Felis_catus 500 1000
G2 Sequence3 NA NA
和另一个df,例如:
df2
COL1 COL2 COL3 COL4 COL5 COL6 Species
ABC_DEF.1 SEQUENCE1 20 80 A 1 Canis_lupus
ABC_DEF.1 SEQUENCE2 500 548 C 3 Canis_lupus
QKC_DEF.2 SEQUENCE2 500 548 Z O Canis_lupus
ABC_DEF.1 SEQUENCE4 520 800 T 9 Canis_lupus
IJK_LMN.1 SEQUENCE1 10 18 D 4 Bos_taurus
AQK_LM9.1 SEQUENCE1 10 18 P 5 Bos_taurus
IJK_LMN.1 SEQUENCE1 30 50 U 0 Bos_taurus
IJK_LMN.1 SEQUENCE3 30 176 E 5 Bos_taurus
OP_D SEQUENCE3 600 700 F 6 Felis_catus
OP_D SEQUENCE1 539 878 G 7 Felis_catus
OP_S SEQUENCE4 20 78 H 8 Felis_catus
这个想法是创建一个新的df,它将在所有数据帧之间合并
这是预期的结果
Groups Names COL2 COL3 COL4 COL5 COL6
G1 ABC_DEF.1:2-300():Canis_lupus SEQUENCE1 20 80 A 1
G1 ABC_DEF.1:400-600():Canis_lupus SEQUENCE2 500 548 B 2
G1 IJK_LMN.1:20-200():Bos_taurus SEQUENCE1 30 50 U 0
G1 IJK_LMN.1:20-200():Bos_taurus SEQUENCE3 30 176 E 5
G2 OP_D:500-1000():Felis_catus SEQUENCE3 600 700 F 6
这个想法是解析Df1中的每个Groups
我们以G1 为例:
ABC_DEF.1:2-300():Canis_lupus 在df2 中,
如果我有与Names 中存在的元素相对应的COL2,我会查看df:
我有 SEQUENCE1 和 SEQUENCE2 属于同一组:
那么如果COL3 和COL4 在COLs - Cole 之间(这里是2-300),
所以 SEQUENCE1 是 20-80 然后我将该行添加到新的 df 中:
Groups Names COL2 COL3 COL4 COL5 COL6
G1 ABC_DEF.1:2-300():Canis_lupus SEQUENCE1 20 80 A 1
SEQUENCE2 是500-548 所以它在2-300之上
然后我对G1 中的第二个名字感兴趣:ABC_DEF.1:400-600():Canis_lupus
还有SEQUENCE1 和SEQUENCE2 但这里只有SEQUENCE2 在400-600 范围内所以我只添加这个
Groups Names COL2 COL3 COL4 COL5 COL6
G1 ABC_DEF.1:2-300():Canis_lupus SEQUENCE1 20 80 A 1
G1 ABC_DEF.1:400-600():Canis_lupus SEQUENCE2 500 548 B 2
现在IJK_LMN.1:20-200():Bos_taurus,我到了df2
SEQUENCE1对应并在20-200范围内
Groups Names COL2 COL3 COL4 COL5 COL6
G1 ABC_DEF.1:2-300():Canis_lupus SEQUENCE1 20 80 A 1
G1 ABC_DEF.1:400-600():Canis_lupus SEQUENCE2 500 548 B 2
G1 IJK_LMN.1:20-200():Bos_taurus SEQUENCE1 30 50 U 0
等
有人对 pandas 和 python 有想法吗?
我想我们应该使用合并和拆分名称来获得每个部分:
例如:
ABC_DEF.1:2-300():Canis_lupus
必须拆分为:
- ABC_DEF.1(第一个
:之前的所有内容) - Canis_lupus(最后一个
:之后的部分)
【问题讨论】:
-
如果您尝试使用
pandas.merge?您可以将每个数据框中的多列指定为键 -
你好@PaulH,是的,我知道你如何使用 pd.merge 但我真的不知道如何处理这个范围问题
-
听起来你最好的选择是对一些列进行更一般的合并,并根据你的值范围相关标准过滤结果。将您已经尝试过的东西作为出发点会很好