Python 从数据框中检索行,以便将数据框列中的行和列表中的元素部分匹配

Python 从数据框中检索行,以便将数据框列中的行和列表中的元素部分匹配,python,pandas,filter,dataframe,Python,Pandas,Filter,Dataframe,我有一个数据帧df: df: chr gene_name 1 ARF3 1 ABC 1 ARF3,ENSG123 1 ENSG1245,ARF3, ENSG89 1 ENSG,ARF3 1 ANG 2 XVY 2 PQR 3

我有一个数据帧df:

df:  
    chr          gene_name

    1           ARF3
    1           ABC
    1           ARF3,ENSG123
    1           ENSG1245,ARF3, ENSG89
    1           ENSG,ARF3
    1           ANG
    2           XVY
    2           PQR
    3           RST
    4           TAC 
和一个
基因列表

gene_list = ['ARF3','ABC' ]
现在,我需要从数据框(df)中获取行,其中的基因名称要么与gene_列表中的元素完全匹配

所以,我试着:

df2 = df1[df.gene_name.isin(gene_list)]
我检索到: 基因名称

    1           ARF3
    1           ABC
     1           ARF3
     1           ABC
     1           ARF3, ENSG123
     1           ENSG1245,ARF3, ENSG89
     1           ENSG,ARF3
     1           ABC
但我期待的是: 基因名称

    1           ARF3
    1           ABC
     1           ARF3
     1           ABC
     1           ARF3, ENSG123
     1           ENSG1245,ARF3, ENSG89
     1           ENSG,ARF3
     1           ABC
所以基本上数据框中的所有行,其中gene_列表中的元素是数据框中gene_name的子字符串

我想用
“.contains()”
如果我换个角度看,数据框中的
gene\u name
应该是
gene\u list
中元素的子字符串

感谢所有的帮助

试试:

df2 = pd.concat([df1[df1['gene_name'].str.contains(gene)] for gene in gene_list])
如果您有更多问题,请告诉我。

解决方案 解释
  • str.split(',',expand=True)
    splits by comma,create new DataFrame
  • isin(基因列表)
    我希望这是显而易见的
  • any(1)
    告诉我上面系列中的任何值是否在列表中

另一个更简单的解决方案,包括:

另一个解决方案:

gene_list = ['ARF3', 'ABC']

#new dafarame with splited values
df1 = df.gene_name.str.split(',', expand=True)
#mask - True where is desired value
mask = df1.isin(gene_list)
#find first valid value in dataframe and create serie by these values
s = df1[mask].dropna(how='all').apply(lambda x: x[x.first_valid_index()], axis=1)
s.name='new'
print (s)
0    ARF3
1     ABC
2    ARF3
3    ARF3
4    ARF3
Name: new, dtype: object

#join series to filtered dataframe - create new column
print (df[mask.any(1)].join(s))
   chr             gene_name   new
0    1                  ARF3  ARF3
1    1                   ABC   ABC
2    1          ARF3,ENSG123  ARF3
3    1  ENSG1245,ARF3,ENSG89  ARF3
4    1             ENSG,ARF3  ARF3

谢谢。这很有效。尽管我还有一个进一步的问题,一个小问题,我如何将一个序列中匹配的基因名称作为一个单独的列附加到另一个序列中。我正在研究它!你应该把它作为一个不同的问题发布。如果这回答了上面的问题,请将其标记为这样。非常感谢。这很有效。尽管我还有一个进一步的问题要问您,但如何将匹配的基因名称作为一个单独的列(追加的列)附加到数据框列中。以便检索除了上述输出之外附加的以下列:附加的列ARF3 ABC ARF3 ARF3 ARF3@piRSquared,我刚做到了!谢谢。这很有效。尽管我可能会问您一个进一步的问题,但如何将匹配的基因名称作为一个单独的列附加到数据框列中。因此,检索最终输出如下:非常感谢您的回复。但是,我得到了以下错误:“AttributeError:'Series'对象没有属性'contains'”。另外,我如何将gene_列表中的匹配元素作为一个单独的列附加到检索到的数据帧中,这非常感谢!这真的很有帮助。很高兴我能帮助你!祝你好运斯洛伐克的时间是2:00。:)谢谢