Python 如何将CSV数据读入NumPy中的记录数组?
我想知道是否有直接的方法将CSV文件的内容导入到记录数组中,就像R的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
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)