熊猫从url读取.csv,起始行的标头较少

时间:2020-08-02 10:17:51

标签: python pandas csv header

我想从this website下载.csv文件(以直接下载here的csv)。我面临的问题是,我要开始导入的行的列数少于后面的行,而我只是无法弄清楚如何读入熊猫。

实际上,这个csv文件并不漂亮。

enter image description here

这是我要在熊猫中导入csv的方式:

  1. 忽略具有“交易日期”的第一行

  2. 各节之间的数据帧分开(用于循环,在有空白行的地方分开)

  3. 在其他列中存储JPX代码(例如16509005)和工具(例如FUT_TOPIX_2009)。

  4. 设置标题['institutions_sell_code','institutions_sell','institutions_sell_eng','amount_sell','institutions_buy_code','institutions_buy','institutions_buy_eng','amount_buy','JPX_code',' / p>

因此,预期结果将是:

enter image description here

这是我的尝试。我首先尝试将整个数据读入熊猫:

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

我认为这是因为header = 1仅具有两列,而其他行具有八列。实际上,当我将header=2设置为排除JPX代码和工具时,它可以工作。那么如何在JPX代码和工具中包含该行?

enter image description here

1 个答案:

答案 0 :(得分:0)

熊猫实际上并不像您一样在一个CSV文件中支持多个文档。为了解决这个问题,我所做的工作很好,它分两个步骤:

  1. 调用一次read_csv(use_cols=[0])以读取最左边的列。使用它来确定每个表的开始和结束位置。
  2. 仅使用open()打开文件一次,对于在步骤1中确定的每个表,调用具有适当值的read_csv(skiprows=SKIP, nrows=ROWS)一次读取一个表。这是关键:通过仅让熊猫读取正确的矩形行,就不会对CSV文件的不卫生性质感到生气。

一次打开​​文件是一种优化,以避免每次执行步骤2时都一遍又一遍地扫描。实际上,如果您seek(0)返回,则实际上也可以将相同的打开文件对象用于步骤1。到开始第2步之前的开始。