我有一个像这样的数据框和三个列表,其中包含有关PDB(结构)是旧的还是新的信息:
>>> my_df
PDB1 PDB2 RMSD Pair
0 A B 0.2 A-B
1 A C 0.1 A-C
2 A D 0.3 A-D
3 B C 0.3 B-C
4 C D 0.4 C-D
5 E F 0.3 E-F
6 E G 0.4 E-G
7 F G 0.2 F-G
all_pdb = [A, B, C, D, E, F, G]
old = [A, B, C]
new = [D, E, F, G]
DF会比较两个结构(PDB1和PDB2),并具有一个用于相似度值(RMSD)的列和一个Pair列。
目标是在研究的整体中保持最小的代表性样本数量,同时将旧的结构保留在新的结构上。例如:
由于没有旧的结构可以代表A,因此在保留B,C和D的同时保留A,然后在保留F和G的同时保留E。
以结构A和E为例,我已经能够检索这两个结构,同时将它们从数据帧中过滤掉,从而得到一个像这样的数据帧:
>>> my_df
PDB1 PDB2 RMSD Pair
0 B C 0.3 B-C
1 C D 0.4 C-D
2 F G 0.2 F-G
问题在于我也在检索B,C和F结构。
现在的代码如下:
pdbs_to_keep = []
all_pdb = [A, B, C, D, E, F, G]
while df.empty == False:
for x in all_pdb:
#Check whether x is in either column
if (x in list(df['PDB1']) or x in list(df['PDB2'])):
#Make a filter selecting all rows with x in either column and delete them from the DF
filter = df[(df['PDB1'] == str(x)) | (df['PDB2'] == str(x))]
df = df[~df['Pair'].isin(filter['Pair'])]
#Add x to the list of structures to keep
pdbs_to_keep.append(x)
break
我希望pdbs_to_keep包含所有A和E,但是它包含所有结构,除了D和G,因为它们出现的行(分别为C和F)在添加之前就被删除了。>
Expected result:
>>>pdbs_to_keep
>>>[A, E]
Actual result:
>>>pdbs_to_keep
>>>[A, B, C, E, F]
我知道问题是我只删除了包含分析结构(A或E)的对,而不是删除包含相关结构(B,C,D,F和G)的对,但是我可以不能让它像我想要的那样工作。
如果解释令人困惑,我不能道歉,英语不是我的母语。任何帮助将不胜感激。
答案 0 :(得分:0)
This should do the trick.
# Logic
for pdb in all_pdb:
lst = df[df['PDB1'] == pdb]['PDB2'].unique()
all_pdb = [x for x in all_pdb if x not in lst]
# Result
print(all_pdb)
['A', 'E']