如何将CSV数据读到NumPy的记录数组?

是否有一种直接的方法将CSV文件的内容导入到记录数组中,就像R的read.table()read.delim()read.csv()将数据导入到R数据框架中一样?

或者我应该使用csv.reader(),然后应用numpy.core.records.fromrecords()?

1113320 次浏览

使用numpy.genfromtxt(),将delimiter kwarg设置为逗号:

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')

您还可以尝试recfromcsv(),它可以猜测数据类型并返回正确格式化的记录数组。

使用# EYZ1:

import pandas as pd
df = pd.read_csv('myfile.csv', sep=',', header=None)
print(df.values)
array([[ 1. ,  2. ,  3. ],
[ 4. ,  5.5,  6. ]])

这给出了一个熊猫DataFrame,它提供了许多有用的数据操作函数,这在numpy记录数组中是不可直接使用的。

DataFrame是一个2维标记数据结构,列为 可能是不同的类型。你可以把它想象成一个电子表格 SQL表…< / p >


我也推荐numpy.genfromtxt。然而,由于问题要求的是记录数组,而不是普通数组,因此需要将dtype=None参数添加到genfromtxt调用中:

import numpy as np
np.genfromtxt('myfile.csv', delimiter=',')

对于下面的'myfile.csv':

1.0, 2, 3
4, 5.5, 6

上面的代码给出了一个数组:

array([[ 1. ,  2. ,  3. ],
[ 4. ,  5.5,  6. ]])

而且

np.genfromtxt('myfile.csv', delimiter=',', dtype=None)

给出一个记录数组:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)],
dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])

这具有使用可以轻松导入多种数据类型(包括字符串)文件的优点。

我试了一下:

from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))

对比:

import csv
import numpy as np
with open(dest_file,'r') as dest_f:
data_iter = csv.reader(dest_f,
delimiter = delimiter,
quotechar = '"')
data = [data for data in data_iter]
data_array = np.asarray(data, dtype = <whatever options>)

对460万行约70列进行了分析,发现NumPy路径花费了2分16秒,csv-list理解方法花费了13秒。

我会推荐csv-list理解方法,因为它很可能依赖于预编译的库,而不是像NumPy那样依赖解释器。我怀疑pandas方法也有类似的解释器开销。

您可以使用此代码将CSV文件数据发送到数组中:

import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)

我试了一下:

import pandas as p
import numpy as n


closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)

当我尝试使用NumPy和Pandas两种方式时,使用Pandas有很多优点:

  • 减少CPU占用
  • 与NumPy genfromttxt相比,RAM占用了1/3

这是我的测试代码:

$ for f in test_pandas.py test_numpy_csv.py ; do  /usr/bin/time python $f; done
2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k
0inputs+24outputs (0major+107147minor)pagefaults 0swaps


23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k
0inputs+0outputs (0major+416145minor)pagefaults 0swaps

test_numpy_csv.py

from numpy import genfromtxt
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')

test_pandas.py

from pandas import read_csv
df = read_csv('/home/hvn/me/notebook/train.csv')

数据文件:

du -h ~/me/notebook/train.csv
59M    /home/hvn/me/notebook/train.csv

在NumPy和熊猫版本:

$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2

使用# EYZ1

一个非常简单的方法。但它要求所有元素都是float (int等)

import numpy as np
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)

这是最简单的方法:

import csv
with open('testfile.csv', newline='') as csvfile:
data = list(csv.reader(csvfile))

现在数据中的每个条目都是一个记录,表示为一个数组。你有一个二维数组。这节省了我很多时间。

我建议使用表(pip3 install tables)你可以保存你的.csv文件到.h5使用熊猫(pip3 install pandas),

import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()

然后,即使对于大量数据,您也可以轻松地用更少的时间将数据加载到NumPy数组中。

import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()


# Data in NumPy format
data = data.values

这件作品很有魅力……

import csv
with open("data.csv", 'r') as f:
data = list(csv.reader(f, delimiter=";"))


import numpy as np
data = np.array(data, dtype=np.float)
In [329]: %time my_data = genfromtxt('one.csv', delimiter=',')
CPU times: user 19.8 s, sys: 4.58 s, total: 24.4 s
Wall time: 24.4 s


In [330]: %time df = pd.read_csv("one.csv", skiprows=20)
CPU times: user 1.06 s, sys: 312 ms, total: 1.38 s
Wall time: 1.38 s

可在最新的熊猫和numpy版本。

import pandas as pd
import numpy as np


data = pd.read_csv('data.csv', header=None)


# Discover, visualize, and preprocess data using pandas if needed.


data = data.to_numpy()

这是一个非常简单的任务,最好的方法如下

import pandas as pd
import numpy as np




df = pd.read_csv(r'C:\Users\Ron\Desktop\Clients.csv')   #read the file (put 'r' before the path string to address any special characters in the file such as \). Don't forget to put the file name at the end of the path + ".csv"


print(df)`


y = np.array(df)