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

Python 如何将CSV数据读入NumPy中的记录数组?,python,numpy,scipy,genfromtxt,Python,Numpy,Scipy,Genfromtxt,我想知道是否有直接的方法将CSV文件的内容导入到记录数组中,就像R的read.table()、read.delim()、和read.CSV()家族将数据导入R的数据框一样 或者是使用并应用类似于numpy.core.records.fromrecords()?的最好方法,您可以使用numpy的genfromtxt()方法,方法是将分隔符kwarg设置为逗号 from numpy import genfromtxt my_data = genfromtxt('my_file.csv', delim

我想知道是否有直接的方法将CSV文件的内容导入到记录数组中,就像R的
read.table()
read.delim()
、和
read.CSV()
家族将数据导入R的数据框一样


或者是使用并应用类似于
numpy.core.records.fromrecords()

的最好方法,您可以使用numpy的
genfromtxt()
方法,方法是将
分隔符
kwarg设置为逗号

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
有关该函数的详细信息可在其各自的网站上找到。

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

我建议使用
库中的函数:

import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])
这给了我们一个大熊猫的机会

DataFrame是一种二维带标签的数据结构,其列为 潜在的不同类型。你可以把它想象成电子表格或 SQL表


我还推荐
genfromtxt
。但是,由于问题要求的是a,而不是普通数组,因此需要将
dtype=None
参数添加到
genfromtxt
调用中:

给定一个输入文件,
myfile.csv

1.0, 2, 3
4, 5.5, 6

import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')
给出一个数组:

array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])
import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)

提供一个记录数组:

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

from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))
从numpy导入genfromtxt
genfromtxt(fname=dest_文件,dtype=())

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>)
导入csv
将numpy作为np导入
打开(目标文件,'r')作为目标文件:
数据读取器=csv.reader(目的地,
分隔符=分隔符,
quotechar=“”)
数据=[数据表中数据的数据]
data\u array=np.asarray(data,dtype=)
在460万行(约70列)上,发现NumPy路径耗时2分钟16秒,csv列表理解方法耗时13秒


我建议使用csv列表理解方法,因为它很可能依赖于预编译库,而不像NumPy那样依赖于解释器。我怀疑pandas方法会有类似的解释器开销。

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

array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])
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)
将熊猫作为p导入
将numpy作为n导入
closingValue=p.read\u csv(“,usecols=[4],dtype=float)
打印(关闭值)

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

  • 更快
  • 减少CPU使用
  • 与NumPy genfromtxt相比,使用了1/3的RAM
这是我的测试代码:

$ 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
测试\u numpy\u csv.py 测试_.py 数据文件: NumPy和pandas的版本:

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

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


这是最简单的方法:

导入csv
打开('testfile.csv',换行符='')作为csvfile:
数据=列表(csv.reader(csvfile))

现在,数据中的每个条目都是一条记录,用数组表示。因此您有了一个2D数组。它为我节省了很多时间。

我建议使用表(
pip3安装表
)。您可以使用pandas(
pip3安装pandas
)将
.csv
文件保存到
.h5

然后,您就可以轻松地将数据加载到一个NumPy数组中,即使是处理大量数据的时间也更短


这是一种魅力…

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)
[329]中的
:%time my_data=genfromtxt('one.csv',分隔符=','))
CPU时间:用户19.8秒,系统4.58秒,总计24.4秒
壁时间:24.4秒
在[330]:%time df=pd.read\u csv(“one.csv”,skiprows=20)
CPU时间:用户1.06秒,系统312毫秒,总计1.38秒
壁时间:1.38秒

如果您想在CSV中维护排序/列名,可以使用以下调用:
numpy.recfromcsv(fname,delimiter=',',,filling_values=numpy.nan,区分大小写=True,deletechars='',replace_space='')
关键参数是最后三个。我用一个包含260万行和8列的csv文件测试了类似的代码。numpy.recfromcsv()大约需要45秒,np.asarray(list(csv.reader())大约需要7秒,pandas.read_csv()大约需要2秒(!)。(在所有情况下,该文件最近都是从磁盘读取的,因此它已经在操作系统的文件缓存中。)我想我会选择pandas。我刚刚注意到关于pandas的快速csv解析器的设计有一些注释。作者非常重视速度和内存要求。也可以使用as_recarray=True直接作为Python记录数组而不是pandas dataframe获得结果。read_csv使用引号内的逗号。R如果您的文件有一个1行的headerBear,记住这会创建一个2d数组:例如
(1000,1)
np。genfromtx
不会这样做:例如
(1000,)
。如果您想要不同类型的东西,比如字符串和整数,可能会重复什么?@CGTheLegend np.genfromtxt('myfile.csv',delimiter=',',dtype=None)对我来说效果很好。我尝试过这个,但我只得到了
nan
值,为什么?还有loadtxt,我得到了
UnicodeDecodeError:“ascii”编解码器无法解码155位的字节0xc3:序号不在范围内(128)
。我在输入数据中有像ä和ö这样的umlauts。@hh尝试添加
encoding=“utf8“
argument。Python是为数不多的经常导致文本编码问题的现代软件之一,感觉就像过去的事情一样。当这些工具的功能膨胀小得多时,我们为什么要使用熊猫呢?请编辑这个问题,并提供有关您的解决方案的更多信息。”。
$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2
import numpy as np 
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)  
import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()
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)