【问题标题】:Python: (partial) matching elements of a list to DataFrame columns, returning entry of a different columnPython:(部分)将列表的元素与 DataFrame 列匹配,返回不同列的条目
【发布时间】:2023-01-05 20:57:07
【问题描述】:

我是 python 的初学者并且遇到了以下问题:我有一个很长的字符串列表(我现在以 3 个为例):

ENSEMBL_IDs = ['ENSG00000040608',
               'ENSG00000070371',
               'ENSG00000070413']

哪个是部分的与我的 DataFrame genes_df 的第 0 列中的数据匹配(显示前 3 个条目):

genes_list = (['ENSG00000040608.28', 'RTN4R'],
            ['ENSG00000070371.91', 'CLTCL1'],
            ['ENSG00000070413.17', 'DGCR2'])

genes_df = pd.DataFrame(genes_list)

我想要执行的任务在概念上并不那么困难:我想比较 ENSEMBL_IDs genes_df.iloc[:,0] 的每个元素(这是部分匹配:ENSEMBL_IDs 的每个元素都包含在 genes_df 的第 0 列中,如概述多于)。如果 EMSEMBL_IDs 的元素与 genes_df.iloc[:,0] 中的元素匹配(它确实如此,除了句点 ".XX" 之后的额外数字),我想返回存储在第一列中的“相应”值genes_df Dataframe:实际基因名称,以'RTN4R'为例。

我想将这些存储在列表中。所以,最后,我会得到如下列表:

`genenames = ['RTN4R', 'CLTCL1', 'DGCR2']`

一些可能有用的信息:ENSEMBL_IDs 中的所有条目都是唯一的,并且它们肯定都包含在 genes_df 的第 0 列中。

我想我正在寻找以下方面的东西:

`genenames = []
for i in ENSEMBL_IDs:
    if i in genes_df.iloc[:,0]:
        genenames.append(# corresponding value in genes_df.iloc[:,1])`

如果之前有人问过这个问题,我很抱歉;我一直在寻找,但无法找到适用于我的问题的解决方案。

谢谢您的帮助!

也感谢编辑,英语不是我的第一语言,所以改进很有见地。

【问题讨论】:

    标签: python-3.x pandas list dataframe


    【解决方案1】:

    在将值与 isin 匹配之前,您可以去掉点之后的部分(使用 str.extractstr.replace):

    m = genes_df[0].str.extract('([^.]+)', expand=False).isin(ENSEMBL_IDs)
    # or
    m = genes_df[0].str.replace('..*$', '', regex=True).isin(ENSEMBL_IDs)
    
    out = genes_df.loc[m, 1].tolist()
    

    或者将正则表达式与 str.match 一起使用:

    pattern = '|'.join(ENSEMBL_IDs)
    m = genes_df[0].str.match(pattern)
    
    out = genes_df.loc[m, 1].tolist()
    

    输出:['RTN4R', 'CLTCL1', 'DGCR2']

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 2018-02-25
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多