Pandas.read_csv: как пропустить строки комментариев - программирование
Подтвердить что ты не робот

Pandas.read_csv: как пропустить строки комментариев

Я думаю, что неправильно понял намерение read_csv. Если у меня есть файл 'j', например

# notes
a,b,c
# more notes
1,2,3

Как я могу pandas.read_csv этот файл, пропуская пропущенные строки '#'? Я вижу, что в помощи "комментарий" строк не поддерживается, но указывает, что должна быть возвращена пустая строка. Я вижу ошибку

df = pandas.read_csv('j', comment='#')

CParserError: данные по токенизации ошибок. C: Ожидаемые 1 поля в строке 2, пила 3 ​​

Сейчас я нахожусь

In [15]: pandas.__version__
Out[15]: '0.12.0rc1'

В версии '0.12.0-199-g4c8ad82 ':

In [43]: df = pandas.read_csv('j', comment='#', header=None)

CParserError: данные по токенизации ошибок. C: Ожидаемые 1 поля в строке 2, пила 3 ​​

4b9b3361

Ответ 1

Итак, я верю в последние выпуски pandas (версия 0.16.0), вы можете добавить параметр comment='#' в pd.read_csv, и это должно пропустить прокомментированные строки.

Эти проблемы github показывают, что вы можете это сделать:

См. документацию на read_csv: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

Ответ 2

Один способ обхода - указать skiprows, чтобы игнорировать первые несколько записей:

In [11]: s = '# notes\na,b,c\n# more notes\n1,2,3'

In [12]: pd.read_csv(StringIO(s), sep=',', comment='#', skiprows=1)
Out[12]: 
    a   b   c
0 NaN NaN NaN
1   1   2   3

В противном случае read_csv немного запутается:

In [13]: pd.read_csv(StringIO(s), sep=',', comment='#')
Out[13]: 
        Unnamed: 0
a   b            c
NaN NaN        NaN
1   2            3

Это похоже на 0.12.0, я зарегистрировал отчет об ошибке.

Как указывает Виктор, вы можете использовать dropna для удаления NaN после факта... (есть недавняя открытая проблема

Ответ 3

Я нахожусь в Pandas версии 0.13.1, и эта проблема с комментариями в csv все еще беспокоит меня.

Вот мое настоящее решение:

def read_csv(filename, comment='#', sep=','):
    lines = "".join([line for line in open(filename) 
                     if not line.startswith(comment)])
    return pd.read_csv(StringIO(lines), sep=sep)

В противном случае с pd.read_csv(filename, comment='#') я получаю

pandas.parser.CParserError: ошибка для токенизации данных. C: Ожидаемые 1 поля в строке 16, пила 3.