【问题标题】:Read_CSV file faster更快地读取_CSV 文件
【发布时间】:2017-03-26 04:00:19
【问题描述】:

我在 pandas 数据框中快速读取 203 mb 文件时遇到了一些问题。我想知道是否有更快的方法可以做到这一点。以下是我的功能:

import pandas as pd
import numpy as np

def file(filename):
    df = pd.read_csv(filename, header=None, sep='delimiter', engine='python', skiprows=1)
    df = pd.DataFrame(df[0].str.split(',').tolist())
    df = df.drop(df.columns[range(4,70)], axis=1)
    df.columns = ['time','id1','id2','amount']
    return df

当我使用魔术%timeit 函数时,读取文件并将其上传到 python 笔记本大约需要 6 秒。我该怎么做才能加快速度?

谢谢!

【问题讨论】:

  • engine='python' - 来自文档:C 引擎更快,而 python 引擎目前功能更完整 - 如果可以的话,坚持使用 C 引擎。跨度>
  • @tdelaney,没错,但是...来自文档:Separators longer than 1 character and different from ‘s+’ will be interpreted as regular expressions, will force use of the python parsing engine and will ignore quotes in the data.
  • @kma,您能否发布 CSV 的 2-3 行样本(即类似格式)?
  • @MaxU - sep='delimiter' 意思是......好吧,我不太确定。这可能意味着示例不正确。
  • @tdelaney,这是一个很好的观点!

标签: python csv pandas dataframe data-science


【解决方案1】:

更新:查看您的逻辑,您似乎不需要首先使用sep='delimiter',因为您将只使用(拆分)第一列(索引=0),所以您可以简单地这样做:

df = pd.read_csv(filename, header=None, usecols=[0,1,2,3],
                 names=['time','id1','id2','amount'],
                 skipinitialspace=True, skiprows=1)

默认情况下,read_csv() 将使用 C 引擎,如果 sep 不超过 1 个字符或 \s+ ,则速度更快

旧答案:

首先不要阅读你不需要的列(或者你将要删除的列:df.drop(df.columns[range(4,70)], axis=1)):

df = pd.read_csv(filename, header=None, usecols=[0], names=['txt'],
                 sep='delimiter', skiprows=1)

然后将单个解析的列拆分为四个:

df[['time','id1','id2','amount']] = df.pop('txt').str.split(',', expand=True)

PS 我强烈建议将您的数据转换为 HDF5 格式(如果可以的话)并忘记 CSV 文件的所有这些问题;)

【讨论】:

  • 您好,非常感谢您的帮助。我收到此错误:Error tokenizing data. C error: Expected 5 fields in line 227, saw 6
  • time, id1, id2, amount, message, 2016-11-02 09:38:53, 49466, 6989, 23.74, ? 2016-11-02 09:38:53, 52349, 8552, 37.1, Pitcher 2016-11-02 09:38:53, 32639, 2562, 18.68, ? 2016-11-02 09:38:53, 15381, 13167, 20.92, For your wife. 这是 .csv 文件的示例
  • @kma,是那一行 (227) 产生了那个错误吗?
  • 嗯,它没有显示行 (227)。但是csv文件就像上面那样。这一切都在一列中。当我拆分它时,它变成了 70 列,这就是我删除它们的原因。但是做所有这些事情需要很长时间。我从来没有处理过这么大的文件。
  • 基本上我想要做的是将一个 ID 支付与另一个连接起来。我有两个文件,一个是旧的付款补丁和一批新的付款。基本上我应该扫描旧批次的付款并确保它通过“ID”链接到新批次的付款。如果有一个连接(比如一些无向图),那么我会返回一个显示已验证的输出。如果不是,则未验证。
猜你喜欢
  • 2017-02-15
  • 2015-08-07
  • 2011-06-18
  • 2021-04-16
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 2018-07-24
相关资源
最近更新 更多