熊猫:如何过滤与值相关的所有行?

时间:2019-05-30 16:31:00

标签: python pandas data-science

我有一个像这样的数据框和三个列表,其中包含有关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)的对,但是我可以不能让它像我想要的那样工作。

如果解释令人困惑,我不能道歉,英语不是我的母语。任何帮助将不胜感激。

1 个答案:

答案 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']