首页 > 解决方案 > 熊猫在子字符串中找到完美匹配

问题描述

我有一个熊猫df:

      0       1       2            3
0  chr1   69090   70008   OR4F5|CDS3
1  chr1  450739  451678  OR4F29|CDS1
2  chr1  925917  926037  SAMD11|CDS2
3  chr1  930154  930336     SAM|CDS2
4  chr1  940555  947899   ERSAM|CDS1
5  chr1  944686  944806   NOC2L|CDS3
6  chr1  945041  945161   NOC2L|CDS3

和一个清单:

genes = ["OR4F5", "SAM"]

如何提取列表中完全匹配的行?

out = pd.DataFrame()
for gene in genes:
    out = pd.concat([out, df[df[3].str.match(gene)]])

产量:

     0       1       2            3
0  chr1   69090   70008   OR4F5|CDS3
2  chr1  925917  926037  SAMD11|CDS2
3  chr1  930154  930336     SAM|CDS2

所需的输出是:

     0       1       2            3
0  chr1   69090   70008   OR4F5|CDS3
3  chr1  930154  930336     SAM|CDS2

很想看到正则表达式的解决方案,因为我一直在努力解决这个问题,但无法让它发挥作用。

标签: pythonpandas

解决方案


IIUC str.split+isin

df[df['3'].str.split('|',expand=True).isin(genes).any(1)]
Out[252]: 
      0       1       2           3
0  chr1   69090   70008  OR4F5|CDS3
3  chr1  930154  930336    SAM|CDS2

推荐阅读