【问题标题】:Remove rows in which string contains other letters than A,C,T,G,N删除字符串中包含除 A、C、T、G、N 以外的其他字母的行
【发布时间】:2021-02-04 14:09:04
【问题描述】:

我对 numpypandas 还很陌生,假设我有一个 2D numpy 数组,我需要删除第二个值仅包含字母 'A''C''T''G''N'

file = 
[['id' 'genome'],
 ['0' 'ATGTTTGTTTTT'],
 ['1' 'ATGTTTGTXXXX'],
 ['2' 'ATGDD2GTTTTT']
]

所以过滤后我可以得到这个

[['id' 'genome'],
 ['0' 'ATGTTTGTTTTT']]

我想做 3 个 for 循环来逐个检查每个字符,但是当我有 500 行时这太慢了

【问题讨论】:

    标签: python arrays pandas numpy


    【解决方案1】:

    Series.str.contains 用于值,^ 用于字符串开头,$ 用于字符串结尾:

    file = [['id', 'genome'],
     ['0', 'ATGTTTGTTTTT'],
     ['1', 'ATGTTTGTXXXX'],
     ['2', 'ATGDD2GTTTTT']
    ]
     
    df = pd.DataFrame(file[1:], columns=file[0])
    print (df)
    
    
    df = df[df['genome'].str.contains('^[ACTGN]+$')]
    print (df)
      id        genome
    0  0  ATGTTTGTTTTT
    

    【讨论】:

    • 当我运行这个时,我得到空数据框,我在 上运行这个代码
    • @newDev2000 - print (df['genome'].head(20).tolist()) 是什么?
    • 不,它可能不起作用,因为它是 numpy.ndarray
    • @newDev2000 - 那么转换为 DataFrame 有问题吗?
    • 好的,所以我已将列表转换为数据框,当我运行此代码时,我得到“indexer = self.columns.get_loc(key) raise KeyError(key) from err KeyError: 0”
    【解决方案2】:

    另一个选项是str.match,其模式与@jezrael 的答案相同:

    df = df[df['genome'].str.match('^[ACTGN]+$')]
    

    另外,我们可以通过str.contains上的否定来检测非法字符:

    # [^ACTGN] detects any characters that are not ACTGN
    df = df[~df['genome'].str.contains('[^ACTGN]')]
    

    【讨论】:

      【解决方案3】:

      其他答案可能更有效,因为它们使用原生 pandas 功能。如果您更熟悉 Python,则可以使用 map 来执行过滤。

      df = DataFrame(
          data={
              'id': [0, 1, 2],
              'genome': ['ATGTTTGTTTTT', 'ATGTTTGTXXXX', 'ATGDD2GTTTTT']
          }
      )
      
      filtered_df = df[df['genome'].map(lambda x: re.sub('[ACTGN]+', '', x) == '')]
      

      在最后一行:

      • 使用 map 在每一行上运行一个函数
      • lambda 语法意味着:对于每个值x,使用函数re.sub('[ACTGN]+', '', x) == ''
      • re.sub 函数表示将 ACTGN 中的任何字符替换为空白。
      • '' 替换已知 字符后,如果字符串为空,则我们希望保留该行。

      这种方法的优点是您可以在 pandas 值上使用任何 python 代码。

      filtered_df = df[df['genome'].map(lambda x: <any-code-you-want-that-yields-a-boolean>)]
      

      【讨论】:

        猜你喜欢
        • 2016-12-16
        • 1970-01-01
        • 2017-09-01
        • 2017-06-06
        • 2013-09-09
        • 2015-11-09
        • 2014-04-16
        • 1970-01-01
        相关资源
        最近更新 更多