как разобрать эту таблицу с помощью pandas.read_csv () с регулярным выражением - PullRequest
0 голосов
/ 15 октября 2019

Я новичок в регулярных выражениях, поэтому этот вопрос может показаться глупым. У меня есть следующая таблица для анализа в панде данных. Первые 18 столбцов разделены пробелами (я не уверен, какой пробел здесь используется, но я пробовал и уверен, что это не табуляция), а 19-й столбец следует проанализировать целиком. На следующем рисунке таблица выглядит в Unix с командой less

Мой текущий код выглядит следующим образом:

import pandas as pd
import numpy as np
import argparse

parser = argparse.ArgumentParser(
    description='Path to the output from hmmscan formatted as parsable table')
parser.add_argument('-f', action="store", dest="f", type=str, required=True)
args = parser.parse_args()


df = pd.read_csv(args.f, header=None, comment='#', sep='\s{18}')
df.columns = ['targetName','targetAccession','queryName','queryAccession',
          'E-value1','score1','bias1','E-value2', 'score2', 'bias2',
          'exp','reg','clu','ov','env','dom','rep','inc','targetDescription']

Однако этот код анализирует только данныетаблица в два столбца, приводящая к следующей ошибке:

[4721 rows x 2 columns]
Traceback (most recent call last):
File "countTF.py", line 15, in <module>
'exp','reg','clu','ov','env','dom','rep','inc','targetDescription']
File "/home/yh362/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 5080, in 
__setattr__
return object.__setattr__(self, name, value)
File "pandas/_libs/properties.pyx", line 69, in pandas._libs.properties.AxisProperty.__set__
File "/home/yh362/anaconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 638, in _set_axis
self._data.set_axis(axis, labels)
File "/home/yh362/anaconda3/lib/python3.7/site-packages/pandas/core/internals/managers.py", line 155, in set_axis
'values have {new} elements'.format(old=old_len, new=new_len))
ValueError: Length mismatch: Expected axis has 2 elements, new values have 19 elements

Я думаю, что мое выражение reg неверно, но не уверен, как написать правильное выражение, так как я совсем не знаком с выражением reg. Надеюсь, кто-нибудь может мне помочь с этим. Спасибо!

1 Ответ

0 голосов
/ 15 октября 2019

read_csv не имеет параметра для установки максимального количества столбцов. Но вы можете подготовить файл с помощью регулярного выражения:

import re
import argparse
import pandas as pd

parser = argparse.ArgumentParser(
    description='Path to the output from hmmscan formatted as parsable table')
parser.add_argument('-f', action="store", dest="f", type=str, required=True)
args = parser.parse_args()

res = []
p = re.compile(r"\s+")
with open(args.f) as f:
    for line in f.read().splitlines():
        if not line.startswith('#'):
            res.append(p.split(line, maxsplit=18))

df = pd.DataFrame(columns=['targetName', 'targetAccession', 'queryName', 'queryAccession',
                           'E-value1', 'score1', 'bias1', 'E-value2', 'score2', 'bias2',
                           'exp', 'reg', 'clu', 'ov', 'env', 'dom', 'rep', 'inc', 'targetDescription'],
                  data=res)

print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...