【问题标题】:How to read html table in Pandas efficiently with speed?如何快速有效地读取 Pandas 中的 html 表格?
【发布时间】:2019-09-20 15:39:00
【问题描述】:

在 pandas 中读取小尺寸的 html 表是可以的,但是 10MB 范围内的大文件或 html 表中的 10000 行/记录让我等待 10 分钟仍然没有进展,而 csv 中的相同被快速解析。

请帮助加快在 pandas 中读取 html 表的速度,或将其转换为 csv。

file='testfile.html'
dfdefault = pd.read_html(file, header = 0, match='Client Inventory Details')
#print(dfdefault)
df = dfdefault[0]

【问题讨论】:

  • 您能补充一些细节吗?可能还有更多上下文?
  • 您在实际代码方面尝试过什么,如果代码很慢,您尝试了哪些不同的方法,您是否理解为什么它会变慢。与鸭子交谈meta.stackoverflow.com/questions/281270/…
  • @J...S 对于像 50 这样的较少项目很好,一旦文件像 10MB 或 1000 行,当我尝试读取 pandas 中的 html 表时,我看不到任何响应。
  • @AndrewAllen file=testfile.html' dfdefault = pd.read_html(file, header = 0, match='Client Inventory Details')
  • @AndrewAllen,到目前为止,我一直在处理 csv 文件并且工作正常,但是如果数据很大,我无法从 html 文件中读取数据,我在 csv 中有完全相同的数据,工作正常,我转向 html 的原因是我不需要做任何事情来获取它,html 会出现在我的电子邮件中。

标签: python html python-3.x pandas csv


【解决方案1】:

HTML 数据集仍然是数据集。为了在 Pandas 中更快地读取大数据集,可以选择不同的策略,read_html 也一样:

1.抽样

2.分块

3.优化 Pandas dtypes

  1. 采样。最简单的选择是对数据集进行抽样。
import pandas
import random

filename = "data.csv" 
n = sum(1 for line in open(filename))-1  # Calculate number of rows in file
s = n//10  # sample size of 10%
skip = sorted(random.sample(range(1, n+1), n-s))  # n+1 to compensate for header 
df = pandas.read_csv(filename, skiprows=skip)
  1. 块/迭代 如果您确实需要处理所有数据,您可以选择将数据拆分为多个块(这些块本身确实适合内存)并对每个单独的块执行数据清理和特征工程
import pandas
from sklearn.linear_model import LogisticRegression
datafile = "data.csv"
chunksize = 100000
models = []
for chunk in pd.read_csv(datafile, chunksize=chunksize):
    chunk = pre_process_and_feature_engineer(chunk) 
    # A function to clean my data and create my features
    model = LogisticRegression()
    model.fit(chunk[features], chunk['label'])
    models.append(model)
df = pd.read_csv("data_to_score.csv")
df = pre_process_and_feature_engineer(df)
predictions = mean([model.predict(df[features]) for model in models], axis=0)
  1. 优化数据类型 从文件加载数据时,Pandas 会自动推断数据类型。当然非常方便,但是,这些数据类型通常不是最优的,并且占用的内存比需要的多。我们将介绍 Pandas 使用的三种最常见的数据类型 —— int、float 和 object —— 并在查看示例时展示如何减少它们的内存印记。

另一种大幅减小 Pandas Dataframe 大小的方法是将 dtype Object 的列转换为类别。

【讨论】:

  • 您尚未展示如何应用此策略来读取 html 文件。虽然第一个可能适用(如果您不需要所有数据),第二个甚至不是 read_html 的有效参数。最后第三个可能适用,但考虑到 read_html 唯一的选项是转换器参数,展示如何做到这一点会很有用
猜你喜欢
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2019-06-21
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多