首页 > 解决方案 > pandas 从 url 读取 .csv,起始行的标题较少

问题描述

我想从这个网站下载一个 .csv 文件(直接下载 csv,在这里)。我面临的问题是,我想开始导入的行的列比后面部分的行少,我只是不知道如何读入熊猫。

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

在此处输入图像描述

这是我想在 pandas 中导入 csv 的方式:

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

  2. 部分之间的单独数据框(使用for循环,只要有空白行就分开)

  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'、'instrument']

所以预期的结果将是:

在此处输入图像描述

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

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 代码和仪器中包含该行?

在此处输入图像描述

标签: pythonpandascsvheader

解决方案


Pandas 并不像您那样真正支持一个 CSV 文件中的多个文档。我为解决这个问题所做的工作很好,需要两个步骤:

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

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


推荐阅读