将CSV文件处理成numpy数组的有效方法

时间:2016-01-20 19:42:32

标签: python arrays csv numpy genfromtxt

CSV文件可能不干净(元素数量不一致的行),需要忽略不清洁的行。 处理过程中需要字符串操作。

示例输入:

20150701 20:00:15.173,0.5019,0.91665

所需的输出:float32(伪日期,当天的秒数,f3,f4)

0.150701 72015.173 0.5019 0.91665 (+ the trailing trash floats usually get)

CSV文件也很大,内存中的numpy数组预计需要5-10 GB,CSV文件超过30GB。

寻找一种有效的方法来处理CSV文件并最终得到一个numpy数组。

当前解决方案:使用csv模块,逐行处理并使用list()作为缓冲区,稍后将使用asarray()转换为numpy数组。问题是,在转换过程中,内存消耗加倍,复制过程增加了执行开销。

Numpy的genfromtxt和loadtxt似乎无法按需处理数据。

3 个答案:

答案 0 :(得分:1)

如果您事先知道数据中有多少行,您可以省去中间list并直接写入数组。

import numpy as np

no_rows = 5
no_columns = 4

a = np.zeros((no_rows, no_columns), dtype = np.float)

with open('myfile') as f:
    for i, line in enumerate(f):
        a[i,:] = cool_function_that_returns_formatted_data(line)

答案 1 :(得分:1)

你认为使用pandas read_csv(引擎=' C')

我发现它是处理csv的最佳和最简单的解决方案之一。我使用4GB文件,它对我有用。

import pandas as pd
df=pd.read_csv('abc.csv',engine='C')
print(df.head(10))

答案 2 :(得分:0)

我认为i/o capability of pandas是将数据转换为numpy数组的最佳方法。具体来说,read_csv方法将读入pandas DataFrame。然后,您可以使用返回的DataFrame的{​​{3}}方法访问基础numpy数组。