【问题标题】:Finding the maximum number of tabs in a multi-row tab delimited file查找多行制表符分隔文件中的最大制表符数
【发布时间】:2018-04-25 11:03:07
【问题描述】:

我正在处理一系列结构有点奇怪的制表符分隔文件。它们是使用 bam-headcount 包创建的,包含序列数据和 DNA 序列短读中每个位置的变体调用。

在某些位置,没有变体调用,在其他位置可能有很多。每行中的选项卡/列数取决于变体调用的数量(每个变体将占据一个新列)。例如:

234    A    3bp_del    4bp_ins
235    G
236    G.   15bp_ins   3bp_del    5bp_del

使用 pandas 解析文件时会出现困难:

import pandas as pd
df = pd.read_csv(FILE, sep='\t')

这会返回一条错误消息:

pandas.errors.ParserError:数据标记错误。 C 错误:预计第 3 行中有 4 个字段,看到 5

发生错误是因为 pandas 使用第一行中的列数来确定它期望看到的列数。我有一个笨拙的解决方法,它在解析之前将带有多列的标题附加到文件中,但它总是会附加相同数量的标题。示例:

Pos    Ref  Call1      Call2       Call3
234    A    3bp_del    4bp_ins
235    G
236    G.   15bp_ins   3bp_del    5bp_del

我正在寻找一种方法来计算列数最多的行中的选项卡数,以便我可以编写一个脚本,在解析之前将这么多列标题附加到每个 CSV 文件的第一行。

【问题讨论】:

  • Python Pandas Error tokenizing data 的可能重复项 - 请查看那里的任何答案是否可以帮助您。您可以通过将 pandas.errors.ParserError: Error tokenizing data 粘贴到 SO 上的搜索中轻松找到类似的帖子。

标签: python pandas csv tabs bioinformatics


【解决方案1】:

要计算一行中文本块的数量,您可以使用正则表达式来计算每行的非空白文本块(最后选择最大值):

import re

column_counter = re.compile('\S+')

columns = []

with open( yourfile, 'r') as dna_file:
    for line in dna_file:
        columns.append(len(column_counter.findall(line)))

max_col_nr = max(columns)

也不需要在 csv 文件中添加标题。您可以通过在加载文件时命名列来克服这个问题:

col_names = ['col_' + str(i) for i in range(max_col_nr)]

your_dataframe = pd.read_csv(yourfile, sep = '\t', names = col_names)

如果内存不是问题,您还可以将每一行存储在一个列表中,并将此列表转换为数据框,因此您无需两次加载文件:

import re
import pandas as pd

rows = []

with open( yourfile, 'r') as dna_file:
    for line in dna_file:
        rows.append(re.findall('\S+',line))

dna_data = pd.DataFrame(rows)

【讨论】:

  • 完美 - 谢谢,第一个解决方案效果很好。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
相关资源
最近更新 更多