pandas читать .csv из url, в начальной строке меньше заголовков - PullRequest
1 голос
/ 02 августа 2020

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

Действительно, это csv файл совсем не красивый.

enter image description here

Here is how I want to import the csv in pandas:

  1. Ignore the first row where there are "Trade Date"

  2. Separate data frame between sections(using for loop, separate wherever there is a blank row)

  3. Store JPX Code(such as 16509005) and Instrument(such as FUT_TOPIX_2009) in additional columns.

  4. Set headers ['institutions_sell_code', 'institutions_sell', 'institutions_sell_eng', 'amount_sell', 'institutions_buy_code', 'institutions_buy', 'institutions_buy_eng', 'amount_buy', 'JPX_code', 'instrument']

So the expected outcome will be:

enter image description here

Here is my try. I first tried to read the whole data into pandas:

import io
import pandas as pd
import requests
url = 'https://www.jpx.co.jp/markets/derivatives/participant-volume/nlsgeu000004vd5b-att/20200730_volume_by_participant_whole_day_J-NET.csv'
s=requests.get(url).content
colnames = ['institutions_sell_code', 'institutions_sell', 'institutions_sell_eng', 'amount_sell', 'institutions_buy_code', 'institutions_buy', 'institutions_buy_eng', 'amount_buy']
df=pd.read_csv(io.StringIO(s.decode('utf-8')), header=1, names = colnames)

ParserError: Error tokenizing data. C error: Expected 2 fields in line 6, saw 8

I assume this is because the header=1 has just two columns whereas other rows have eight. In fact when I set header=2 to exclude JPX Code and Instrument, it works. So how can I include the row with JPX Code and Instrument?

введите описание изображения здесь

1 Ответ

0 голосов
/ 02 августа 2020

Pandas не поддерживает несколько документов в одном CSV-файле, как у вас. То, что я сделал для решения этой проблемы и работало нормально, состоит из двух шагов:

  1. Вызов read_csv(use_cols=[0]) один раз, чтобы прочитать крайний левый столбец. Используйте это, чтобы определить, где начинается и заканчивается каждая таблица.
  2. Откройте файл, используя open() только один раз, и для каждой таблицы, определенной на шаге 1, вызовите read_csv(skiprows=SKIP, nrows=ROWS) с соответствующими значениями, чтобы читать по одной таблице за раз . Это ключ: позволяя Pandas читать только правильные прямоугольные angular строки, он не рассердится на негигиеничный c характер вашего CSV-файла.

Открытие файла просто Once является оптимизацией, чтобы не сканировать его снова и снова каждый раз при выполнении шага 2. Фактически вы можете использовать один и тот же открытый файловый объект и для шага 1, если вы seek(0) вернетесь в начало перед началом шага 2.

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