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

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


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

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

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


使用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是一个2维标记数据结构,列为 可能是不同的类型。你可以把它想象成一个电子表格 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. ]])

and

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

使用numpy.loadtxt

一个非常简单的方法。但它要求所有元素都是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)。您可以使用pandas将.csv文件保存到.h5。

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)