Интересно, существует ли прямой способ импортировать содержимое CSV-файла в массив записей, подобно тому, как семейства R'read.table(),
read.delim()и
read.csv()` импортируют данные в R'data frame?
Или лучше всего использовать csv.reader(), а затем применить что-то вроде numpy.core.records.fromrecords()
?
Для этого можно использовать метод Numpy'genfromtxt()
, установив в качестве ключа delimiter
запятую.
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
Более подробную информацию о функции можно найти в соответствующей документации.
Я бы рекомендовал использовать функцию read_csv
из библиотеки pandas
:
import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
Это дает pandas DataFrame - позволяя множество полезных функций манипулирования данными, которые не доступны напрямую с массивами записей numpy.
DataFrame - это двумерная маркированная структура данных, столбцы которой имеют потенциально различных типов. Вы можете думать о нем как об электронной таблице или SQL-таблицу...
Я бы также рекомендовал genfromtxt
. Однако, поскольку в вопросе запрашивается массив записей, а не обычный массив, в вызов genfromtxt
необходимо добавить параметр dtype=None
:
Дан входной файл 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. ]])
и
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>)
на 4,6 млн. строк около 70 столбцов и обнаружили, что путь включает в себя 2 мин 16 сек и CSV-список способ постижения заняла 13 секунд.
Я бы рекомендовал CSV-список способ понимания, как и это, скорее всего, опирается на предварительно скомпилированные библиотеки, а не переводчик так сильно, как numpy. Я подозреваю, что способ панд будет иметь аналогичную переводчик накладных.
Как я попробовал оба пути, используя NumPy и панды, используя панд имеет много преимуществ:
Это мой тестовый код:
$ 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 и панды в вариантах:
$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2
Вы можете использовать этот код для отправки данных в формате 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.loadtxt
Довольно простой способ. Но он требует, чтобы все элементы поплавка (int и т. д.)
import numpy as np
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)
Это самый простой способ:
импорт CSV с открытыми('вопросами и ответами.КШМ', строки='') как csvfile, был: = список данных(CSV.читатель(csvfile, был))
Теперь каждая запись данных-это запись, представленная в виде массива. Так что у вас есть 2Д массив. Он спас меня так много времени.
Я хотел бы предложить, используя таблицы (pip3 установить таблицы
). Вы можете сохранить ваши .файл CSV
до .Н5 с помощью панды (
pip3 установки панды`),
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
Эта работа как шарм... `` импорт CSV с открытыми("По данных.CSV-файл" и, 'Р') как F: = список данных(CSV.читатель(Ф, разделитель=и"; и"))
импорт включает в себя как НП данные = НП.массив(данных, dtype=НП.поплавок) ``