是否有一种直接的方法可以将CSV文件的内容导入记录数组中,就像R语言的 read.table()
、read.delim()
和 read.csv()
将数据导入到R数据框中那样?
或者我应该使用csv.reader()
然后再应用numpy.core.records.fromrecords()
吗?
是否有一种直接的方法可以将CSV文件的内容导入记录数组中,就像R语言的 read.table()
、read.delim()
和 read.csv()
将数据导入到R数据框中那样?
或者我应该使用csv.reader()
然后再应用numpy.core.records.fromrecords()
吗?
通过将delimiter
参数设置为逗号,使用numpy.genfromtxt()
:
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
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
。然而,由于问题要求一个record array,而不是普通的数组,需要在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')])
(1000, 1)
。np.genfromtxt
不会这样做:例如 (1000,)
。 - Newskoolerdf.values
,它提供了一个 DataFrame 的 Numpy 表示;这是我认为很方便的方法。 - Lee我试过了:
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>)
我对大约70列的460万行数据进行了测试,结果发现使用NumPy需要2分16秒,而使用csv列表推导方法只需要13秒。
我建议使用csv列表推导方法,因为它很有可能依赖于预编译的库,而不像NumPy那样严重依赖解释器。我怀疑使用pandas方法也会有类似的解释器开销。
您还可以尝试使用recfromcsv()
,该函数可以猜测数据类型并返回格式正确的记录数组。
numpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' ')
。关键参数是最后三个。 - eacousineau我尝试使用NumPy和Pandas两种方式,但是使用Pandas有很多优点:
这是我的测试代码:
$ 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
from numpy import genfromtxt
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')
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和pandas在以下版本:
$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2
使用numpy.loadtxt
是一种非常简单的方法。但是需要注意所有元素都必须是浮点数(整数等不行)。
import numpy as np
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)
data2 = np.genfromtxt('c:\\1.csv', delimiter=',')
- Konstantin Fimport numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)
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)
我建议使用 tables (pip3 install tables
)。使用 pandas (pip3 install 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('testfile.csv', newline='') as csvfile:
data = list(csv.reader(csvfile))
现在,data中的每个条目都是一个记录,表示为数组。因此,您有一个二维数组。这节省了我很多时间。
nan
值,为什么?同时使用 loadtxt 函数时,我遇到了UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128)
的错误。我的输入数据中包含像 ä 和 ö 这样的字符。 - hhhencoding="utf8"
参数。Python 是少数几个经常引起文本编码问题的现代软件之一,这些问题让人感觉像来自过去的事情。 - kolen