pandas 保留一列中的值在另一列中找到的行

yyhrrdl8  于 2023-05-21  发布在  其他
关注(0)|答案(2)|浏览(145)

我有一个包含许多列的数据框,但我只显示相关列

IGV_table[["Revel_Transcripts", "Ensembl"]].head(30).to_dict()
# Converted to dict so that you can use this two-column dataframe

{'Revel_Transcripts': {0: 'ENST00000438426',
  1: 'ENST00000438426',
  2: 'ENST00000438426',
  3: 'ENST00000438426',
  4: 'ENST00000438426',
  5: 'ENST00000438426',
  6: 'ENST00000438426',
  7: 'ENST00000438426',
  8: 'ENST00000438426',
  9: 'ENST00000438426',
  10: 'ENST00000438426',
  11: 'ENST00000438426',
  12: 'ENST00000438426',
  13: 'ENST00000438426',
  14: 'ENST00000438426',
  15: 'ENST00000438426',
  16: 'ENST00000438426',
  17: 'ENST00000438426',
  18: 'ENST00000438426',
  19: 'ENST00000438426',
  20: 'ENST00000438426',
  21: 'ENST00000438426;ENST00000318560',
  22: 'ENST00000438426;ENST00000318560',
  23: 'ENST00000438426;ENST00000318560',
  24: 'ENST00000438426;ENST00000318560',
  25: 'ENST00000438426;ENST00000318560',
  26: 'ENST00000438426;ENST00000318560',
  27: 'ENST00000438426;ENST00000318560',
  28: 'ENST00000438426;ENST00000318560',
  29: 'ENST00000438426;ENST00000318560'},
 'Ensembl': {0: 'ENST00000318560',
  1: 'ENST00000318560',
  2: 'ENST00000318560',
  3: 'ENST00000318560',
  4: 'ENST00000318560',
  5: 'ENST00000318560',
  6: 'ENST00000318560',
  7: 'ENST00000318560',
  8: 'ENST00000318560',
  9: 'ENST00000318560',
  10: 'ENST00000318560',
  11: 'ENST00000318560',
  12: 'ENST00000318560',
  13: 'ENST00000318560',
  14: 'ENST00000318560',
  15: 'ENST00000318560',
  16: 'ENST00000318560',
  17: 'ENST00000318560',
  18: 'ENST00000318560',
  19: 'ENST00000318560',
  20: 'ENST00000318560',
  21: 'ENST00000318560',
  22: 'ENST00000318560',
  23: 'ENST00000318560',
  24: 'ENST00000318560',
  25: 'ENST00000318560',
  26: 'ENST00000318560',
  27: 'ENST00000318560',
  28: 'ENST00000318560',
  29: 'ENST00000318560'}}

我想保留Ensembl中的值在列Revel_Transcripts中找到的行。Revel_Transcripts可以有一个或多个值,由“”分隔;“而Ensembl列只有一个值,如ENST 00000318560
预期结果

Revel_Transcripts          Ensembl

21  ENST00000438426;ENST00000318560  ENST00000318560
22  ENST00000438426;ENST00000318560  ENST00000318560
23  ENST00000438426;ENST00000318560  ENST00000318560
24  ENST00000438426;ENST00000318560  ENST00000318560
25  ENST00000438426;ENST00000318560  ENST00000318560
26  ENST00000438426;ENST00000318560  ENST00000318560
27  ENST00000438426;ENST00000318560  ENST00000318560
28  ENST00000438426;ENST00000318560  ENST00000318560
29  ENST00000438426;ENST00000318560  ENST00000318560
dsekswqp

dsekswqp1#

如果需要测试每行的成员资格,使用Series.str.splitexpand=True,按DataFrame.eq进行比较,并测试DataFrame.any中是否至少有一个值匹配,并按boolean indexing进行过滤:

mask = (IGV_table['Revel_Transcripts'].str.split(';', expand=True)
                                      .eq(IGV_table['Ensembl'], axis=0)
                                      .any(axis=1))
df = IGV_table[mask]

或者使用列表解析来测试按列Ensembl拆分的值:

mask = [b in a.split(';') for a, b in 
        zip(IGV_table['Revel_Transcripts'], IGV_table['Ensembl'])]
df = IGV_table[mask]

print (df)
                  Revel_Transcripts          Ensembl
21  ENST00000438426;ENST00000318560  ENST00000318560
22  ENST00000438426;ENST00000318560  ENST00000318560
23  ENST00000438426;ENST00000318560  ENST00000318560
24  ENST00000438426;ENST00000318560  ENST00000318560
25  ENST00000438426;ENST00000318560  ENST00000318560
26  ENST00000438426;ENST00000318560  ENST00000318560
27  ENST00000438426;ENST00000318560  ENST00000318560
28  ENST00000438426;ENST00000318560  ENST00000318560
29  ENST00000438426;ENST00000318560  ENST00000318560
w8f9ii69

w8f9ii692#

您可以用途:

mask = (IGV_table['Revel_Transcripts'].str.split(';').explode()
            .isin(IGV_table['Ensembl']).groupby(level=0).max())
out = IGV_table[mask]

输出:

>>> out
                  Revel_Transcripts          Ensembl
21  ENST00000438426;ENST00000318560  ENST00000318560
22  ENST00000438426;ENST00000318560  ENST00000318560
23  ENST00000438426;ENST00000318560  ENST00000318560
24  ENST00000438426;ENST00000318560  ENST00000318560
25  ENST00000438426;ENST00000318560  ENST00000318560
26  ENST00000438426;ENST00000318560  ENST00000318560
27  ENST00000438426;ENST00000318560  ENST00000318560
28  ENST00000438426;ENST00000318560  ENST00000318560
29  ENST00000438426;ENST00000318560  ENST00000318560

相关问题