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
Ответы
Ответ 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.