如何将CSV数据读入NumPy的记录数组?
有没有一种直接的方法可以把CSV文件的内容导入到记录数组中,就像R语言的read.table()
、read.delim()
和read.csv()
可以把数据导入到R的数据框里一样?
还是说我应该先使用csv.reader()
,然后再用numpy.core.records.fromrecords()
来处理?
14 个回答
94
我试了一下:
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列表推导的方法只花了13秒。
我推荐使用csv列表推导的方法,因为它更可能依赖于预编译的库,而不是像NumPy那样依赖解释器。我猜pandas的方法也会有类似的解释器开销。
244
使用 pandas.read_csv
:
import pandas as pd
df = pd.read_csv('myfile.csv', sep=',', header=None)
print(df.values)
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
这样可以得到一个 pandas 的 DataFrame
,它提供了很多有用的数据处理功能,这些功能在 numpy 的记录数组中是没有的。
DataFrame
是一种二维的数据结构,里面的列可以有不同的数据类型。你可以把它想象成一个电子表格或者 SQL 数据库中的表格……
我还推荐使用 numpy.genfromtxt
。不过,因为问题是要一个 记录数组,而不是普通数组,所以在调用 genfromtxt
时需要加上 dtype=None
参数:
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')])
这样做的好处是,可以很方便地导入包含 多种数据类型(包括字符串)的文件。
872
使用 numpy.genfromtxt()
函数时,可以把 delimiter
参数设置为逗号,这样就能正确读取用逗号分隔的数据了。
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')