Me pregunto si hay una forma directa de importar el contenido de un archivo CSV en una matriz de registro, tanto en la forma en que de R read.table()
, read.delim()
y read.csv()
la importación de datos a la familia trama de datos de R?
¿O es la mejor manera de usar csv.reader () y luego aplicar algo como numpy.core.records.fromrecords()
?
python
numpy
scipy
genfromtxt
hatmatrix
fuente
fuente
Respuestas:
Puede usar el
genfromtxt()
método de Numpy para hacerlo, estableciendo eldelimiter
kwarg en una coma.Puede encontrar más información sobre la función en su documentación respectiva .
fuente
nan
valores, ¿por qué? También con loadtxt, estoy obteniendoUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128)
. Tengo diéresis como ä y ö en los datos de entrada.encoding="utf8"
argumento. Python es una de las pocas piezas de software modernas que con frecuencia causa problemas de codificación de texto, que se sienten como cosas del pasado.Recomendaría la
read_csv
función de lapandas
biblioteca:Esto proporciona un DataFrame de pandas , que permite muchas funciones útiles de manipulación de datos que no están disponibles directamente con matrices de registros numpy .
Yo también lo recomendaría
genfromtxt
. Sin embargo, dado que la pregunta solicita una matriz de registros , a diferencia de una matriz normal, eldtype=None
parámetro debe agregarse a lagenfromtxt
llamada:Dado un archivo de entrada,
myfile.csv
:da una matriz:
y
da una matriz de registros:
Esto tiene la ventaja de que el archivo con múltiples tipos de datos (incluidas las cadenas) se puede importar fácilmente .
fuente
(1000, 1)
.np.genfromtxt
no hace eso: ej(1000,)
.Cronometré el
versus
en 4.6 millones de filas con aproximadamente 70 columnas y descubrió que la ruta NumPy tomó 2 min 16 segundos y el método de comprensión de la lista csv tomó 13 segundos.
Recomendaría el método de comprensión csv-list, ya que probablemente se basa en bibliotecas precompiladas y no en el intérprete tanto como NumPy. Sospecho que el método de los pandas tendría una sobrecarga de intérprete similar.
fuente
También puede probar
recfromcsv()
qué puede adivinar los tipos de datos y devolver una matriz de registros con el formato adecuado.fuente
numpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' ')
Los argumentos clave son los tres últimos.Como probé en ambos sentidos usando NumPy y Pandas, usar pandas tiene muchas ventajas:
Este es mi código de prueba:
test_numpy_csv.py
test_pandas.py
Archivo de datos:
Con NumPy y pandas en las versiones:
fuente
Puede usar este código para enviar datos del archivo CSV a una matriz:
fuente
Utilizando
numpy.loadtxt
Un método bastante simple. Pero requiere que todos los elementos sean flotantes (int, etc.)
fuente
Esta es la manera más fácil:
import csv with open('testfile.csv', newline='') as csvfile: data = list(csv.reader(csvfile))
Ahora cada entrada en los datos es un registro, representado como una matriz. Entonces tienes una matriz 2D. Me ahorró mucho tiempo.
fuente
Intenté esto:
fuente
Sugeriría usar tablas (
pip3 install tables
). Puede guardar su.csv
archivo en.h5
pandas (pip3 install pandas
),Luego, puede cargar fácilmente sus datos en una matriz NumPy , y con menos tiempo incluso para una gran cantidad de datos .
fuente
Este trabajo como un encanto ...
fuente