我正在研究一系列制表符分隔的文件,这些文件的结构略显奇怪。它们使用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文件的第一行。< / p>
答案 0 :(得分:0)
要计算一行中文本块的数量,可以使用正则表达式计算每行的非空白文本块(最后选择最大值):
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)