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

566 投票
14 回答
1231932 浏览
提问于 2025-04-16 03:00

有没有一种直接的方法可以把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=',')

撰写回答