【问题标题】:Extract all instances of a substring in an array column and move to a new column提取数组列中子字符串的所有实例并移动到新列
【发布时间】:2021-10-15 20:12:02
【问题描述】:

我对 python 还很陌生,所以请与我交流。我正在尝试提取两个标记之间特定子字符串的所有实例并将其导出到新列。该文件包含数千列,有时我感兴趣的列 (['INFO']) 有数百行。具体来说,我想提取始终跟随“|HIGH|”的字符串如下例所示。

**#CHROM    POS ALT INFO
217 1   21351411    <DEL>   SVTYPE=DEL;STRANDS=+-:25;SVLEN=-18597;END=21370008;CIPOS=-10,652;CIEND=-236,9;CIPOS95=-1,104;CIEND95=-48,2;IMPRECISE;SU=25;PE=25;SR=0;ANN=<DEL>|transcript_ablation|HIGH|Khdc1c|Khdc1c|transcript|NM_001033904.1|protein_coding|1/3|c.-17246_*281del|p.0?|||||,<DEL>|splice_region_variant&downstream_gene_variant|LOW|Khdc1a|Khdc1a|transcript|NM_183322.2|protein_coding|3/3|c.*319_*18915del|||||0|,<DEL>|3_prime_UTR_variant|MODIFIER|Khdc1a|Khdc1a|transcript|NM_183322.2|protein_coding|3/3|c.*319_*18915del|||||319|,<DEL>|upstream_gene_variant|MODIFIER|Khdc1c|Khdc1c|transcript|NM_001033904.1|protein_coding|1/3|c.-17246_*281del|||||16919|,<DEL>|downstream_gene_variant|MODIFIER|Khdc1c|Khdc1c|transcript|NM_001033904.1|protein_coding|1/3|c.-17246_*281del|||||0|,<DEL>|intergenic_region|MODIFIER|Khdc1a-Khdc1c|Khdc1a-Khdc1c|intergenic_region|Khdc1a-Khdc1c|||n.21351412_21370008del||||||,<DEL>|intergenic_region|MODIFIER|Khdc1c-Khdc1b|Khdc1c-Khdc1b|intergenic_region|Khdc1c-Khdc1b|||n.21351412_21370008del||||||,**

我对 ['INFO'] 列感兴趣的每一行都包含“...|HIGH|Gene_here|”。 给定行中可能有数百个这样的行,我希望给定行的所有子字符串实例都导出到一个新列但保留在同一行中。我只想要“|HIGH|”后面的基因名称但在下一个“|”之前结束在所有情况下都被提取到新列中。

我曾尝试使用正则表达式通过 for 循环执行此操作,但无法完全弄清楚。

import re
for substring in df['INFO']:
    df = df['INFO']
    pattern = "HIGH\|(\w+)\|"
    substring = re.search(pattern, df).group(1)
    df['GENE'] = susbtring

【问题讨论】:

  • 也许您应该使用适当的工具解析您的字符串。看看 BioPython。

标签: python arrays pandas


【解决方案1】:

我不确定你为什么在那里使用for 循环,但是为了执行你所说的操作,我会编写如下代码。

for frame in df:
   keyWord = '|HIGH|'
   tempString = str(df[frame]['INFO'])
   index = tempString.find(keyWord)
   rIndex = tempString.find('|',index+len(keyWord))
   df[frame]['GENE'] = tempString[index+len(keyWord):rIndex]

【讨论】:

  • 当我尝试运行此代码时,我收到一个属性错误,提示“系列”对象没有属性“查找”。我尝试使用我制作的新代码 '''df['GENE'] = df.INFO.str.extractall('HIGH|(\w+)|')''' 但我认为 python 想要将每个新单词放入单独的行,因为我收到错误“TypeError:插入列的索引与帧索引不兼容”,这导致“ValueError:缓冲区dtype不匹配,预期'Python对象'但得到'long long'”。有没有办法将一行中的所有子字符串连接在新列的同一行中?
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
相关资源
最近更新 更多