Поиск максимального количества вкладок в многострочном файле с разделителями вкладок - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над серией файлов с разделителями табуляции, которые имеют немного странную структуру. Они создаются с помощью пакета bam-headcount и содержат данные о последовательности и варианты вызовов для каждой позиции в кратком чтении последовательности ДНК.

В некоторых позициях нет альтернативных вызовов, в других их может быть много. Количество вкладок / столбцов в каждой строке зависит от количества выполненных вызовов вариантов (каждый вариант будет занимать новый столбец). Например:

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

Сложность возникает при разборе файла пандами с использованием:

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

Возвращает сообщение об ошибке:

pandas.errors.ParserError: Ошибка токенизации данных. Ошибка C: ожидается 4 поля в строке 3, пила 5

Ошибка возникает из-за того, что панды определяют количество столбцов, которые ожидают увидеть, используя количество столбцов в первой строке. У меня есть неуклюжий обходной путь, который добавляет к файлу заголовок с несколькими столбцами перед анализом, но он всегда будет добавлять одинаковое количество заголовков. Пример:

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

Я ищу способ подсчитать количество вкладок в строке с наибольшим количеством столбцов, чтобы я мог написать скрипт для добавления такого количества заголовков столбцов к первой строке каждого файла CSV перед анализом.

1 Ответ

0 голосов
/ 25 апреля 2018

Чтобы подсчитать количество текстовых блоков в строке, вы можете использовать регулярное выражение для подсчета непробельных блоков текста для каждой строки (и в конце выбрать максимальное значение):

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...