Pandas read_csv возвращает слишком много строк при использовании пропусков

#pandas #dataframe

#pandas #фрейм данных

Вопрос:

У меня есть файл CSV, содержащий заголовок и 12 653 750 строк данных. Я хотел бы использовать pandas для чтения заголовка и последних 2 653 750 строк. Другими словами, я хотел бы пропустить первые 10 000 000 строк данных и с помощью этого кода:

 part_data = pd.read_csv("data.csv", skiprows=range(1, 10000001), index_col=False)
  

Поэтому я ожидаю, что pandas вернет фрейм данных с заголовком и 2 653 750 строками данных. Однако то, что я получаю от pandas, — это фрейм данных с заголовком и 5 123 000 строк данных, что не должно быть возможным. Забавно, что когда я попробовал skiprows=range(1, 20000001) pandas по-прежнему возвращает dataframe (без каких-либо ошибок), но теперь с 123 000 строк, хотя полные данные не содержат так много строк.

Я попробовал тот же код на довольно небольшом наборе данных с 50 строками, и там он работает отлично. Есть идеи, что может быть причиной такого странного поведения и, самое главное, как обойти эту проблему?

Просто чтобы сказать это заранее, я полностью осведомлен о других пакетах, таких как vaex или Dask (которые в какой-то момент сводили меня с ума), но я хотел, чтобы этот простой процесс работал с pandas.

Комментарии:

1. Что произойдет, если вы посмотрите на начало / конец импортированного df? Являются ли импортированные строки полными строками? Или он разделяет ваши строки после некоторого столбца?

2. Похоже на ошибку. Вместо этого вы можете попробовать Dictreader использовать модуль csv, а затем преобразовать результаты в Dataframe.

3. @noah Спасибо за ваше предложение. Я только что проверил, и оба .head() и .tail() возвращают строки с данными (непустыми). Чтобы перепроверить, я также открыл файл с помощью программы для просмотра больших файлов и обнаружил, что все остальные строки в моем CSV-файле были пустыми, начиная со строки 5 061 501 и далее. Поскольку .read_csv skip_blank_lines=True по умолчанию используется параметр (я не знал об этом) Я получаю именно то количество строк, которое ожидалось при загрузке полных данных. Но, похоже, это плохо работает при использовании skiprows аргумента.

4. @MichaelGardner Спасибо за ваше предложение. Я буду иметь в виду эту опцию.