Estoy interesado en saber cómo convertir un marco de datos de pandas en una matriz NumPy.
marco de datos:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
da
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
Me gustaría convertir esto a una matriz NumPy, así:
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
¿Cómo puedo hacer esto?
Como beneficio adicional, ¿es posible preservar los dtypes, como este?
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
¿o similar?
Respuestas:
Para convertir un marco de datos de pandas (df) en un ndarray numpy, use este código:
fuente
Desprecia tu uso de
values
yas_matrix()
!pandas v0.24.0 introdujo dos nuevos métodos para obtener matrices NumPy de objetos pandas:
to_numpy()
, que se define enIndex
,Series,
yDataFrame
objetos, yarray
, Que se define enIndex
ySeries
objetos solamente.Si visita los documentos de v0.24 para
.values
, verá una gran advertencia roja que dice:Consulte esta sección de las notas de la versión v0.24.0 y esta respuesta para obtener más información.
Hacia una mejor consistencia:
to_numpy()
En el espíritu de una mejor consistencia en toda la API,
to_numpy
se ha introducido un nuevo método para extraer la matriz subyacente NumPy de DataFrames.Como se mencionó anteriormente, este método también se define en
Index
ySeries
objetos (ver aquí ).De forma predeterminada, se devuelve una vista, por lo que cualquier modificación realizada afectará al original.
Si necesita una copia, use
to_numpy(copy=True
).pandas> = 1.0 actualización para ExtensionTypes
Si está usando pandas 1.x, es probable que esté lidiando con tipos de extensión mucho más. Deberá tener un poco más de cuidado para que estos tipos de extensión se conviertan correctamente.
Esto se llama en los documentos .
Si necesitas el
dtypes
...Como se muestra en otra respuesta,
DataFrame.to_records
es una buena manera de hacer esto.Esto no se puede hacer
to_numpy
, desafortunadamente. Sin embargo, como alternativa, puede usarnp.rec.fromrecords
:En cuanto al rendimiento, es casi lo mismo (en realidad, el uso
rec.fromrecords
es un poco más rápido).Justificación para agregar un nuevo método
to_numpy()
(además dearray
) se agregó como resultado de las discusiones bajo dos temas de GitHub GH19954 y GH23623 .Específicamente, los documentos mencionan la justificación:
to_numpy
pretenden mejorar la consistencia de la API, que es un paso importante en la dirección correcta..values
no quedará en desuso en la versión actual, pero espero que esto pueda suceder en algún momento en el futuro, por lo que instaría a los usuarios a migrar hacia la API más nueva, tan pronto como sea posible.Crítica de otras soluciones
DataFrame.values
tiene un comportamiento inconsistente, como ya se señaló.DataFrame.get_values()
es simplemente una envolturaDataFrame.values
, por lo que se aplica todo lo dicho anteriormente.DataFrame.as_matrix()
ahora está en desuso, ¡ NO lo use!fuente
as_matrix
otra solución, en este caso,to_numpy
sin explicar cómo recuperar la funcionalidad de selección de columna deas_matrix
! Estoy seguro de que hay otras formas de seleccionar columnas, ¡peroas_matrix
al menos era una de ellas!df[[col1, col2']].to_numpy()
? No estoy seguro de por qué cree que desear anunciar una alternativa actualizada a una función obsoleta garantiza un voto negativo en la respuesta.Nota : El
.as_matrix()
método utilizado en esta respuesta está en desuso. Pandas 0.23.4 advierte:Pandas tiene algo construido en ...
da
fuente
object
.to_numpy
lugar (.values
tampoco). Más aquí .Simplemente encadenaría las funciones DataFrame.reset_index () y DataFrame.values para obtener la representación Numpy del marco de datos, incluido el índice:
Para obtener los dtypes, necesitaríamos transformar este ndarray en una matriz estructurada usando view :
fuente
Puedes usar el
to_records
método, pero tienes que jugar un poco con los dtypes si no son lo que quieres desde el principio. En mi caso, después de haber copiado su DF de una cadena, el tipo de índice es una cadena (representada por unobject
dtype en pandas):Convertir el dtype de recarray no funciona para mí, pero ya se puede hacer esto en Pandas:
Tenga en cuenta que Pandas no establece el nombre del índice correctamente (para
ID
) en la matriz de registros exportados (¿un error?), Por lo que nos beneficiamos de la conversión de tipos para corregir también eso.Por el momento, Pandas solo tiene enteros de 8 bytes
i8
, y flota,f8
(vea este número ).fuente
np.array
constructor.Parece
df.to_records()
que funcionará para ti. Se solicitó la función exacta que está buscando y seto_records
señaló como alternativa.Probé esto localmente usando su ejemplo, y esa llamada produce algo muy similar al resultado que estaba buscando:
Tenga en cuenta que esto es
recarray
más que unarray
. Puede mover el resultado a una matriz numpy normal llamando a su constructor comonp.array(df.to_records())
.fuente
to_records()
más de 5 años?Prueba esto:
fuente
Aquí está mi enfoque para hacer una matriz de estructura a partir de un DataFrame de pandas.
Crea el marco de datos
Defina la función para hacer una matriz de estructura numpy (no una matriz de registros) a partir de un DataFrame de pandas.
Utilícelo
reset_index
para crear un nuevo marco de datos que incluya el índice como parte de sus datos. Convierta ese marco de datos en una matriz de estructura.EDITAR: Se actualizó df_to_sarray para evitar errores al llamar a .encode () con python 3. Gracias a Joseph Garvin y halcyon por sus comentarios y soluciones.
fuente
Dos formas de convertir el marco de datos a su representación de Numpy-array.
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
Doc: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html
fuente
Una forma más simple de ejemplo de DataFrame:
UTILIZAR:
OBTENER:
fuente
Simplemente tuve un problema similar al exportar desde el marco de datos a la tabla arcgis y tropecé con una solución de usgs ( https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table ). En resumen, su problema tiene una solución similar:
fuente
Revisé las respuestas anteriores. El método " as_matrix () " funciona pero ahora está obsoleto. Para mí, lo que funcionó fue " .to_numpy () ".
Esto devuelve una matriz multidimensional. Preferiré usar este método si está leyendo datos de la hoja de Excel y necesita acceder a datos desde cualquier índice. Espero que esto ayude :)
fuente
Además de la respuesta de meteore, encontré el código
no funciona para mi Así que puse mi código aquí para la conveniencia de otros atascados con este problema.
fuente
Una forma sencilla de convertir el marco de datos en una matriz numpy:
Se recomienda el uso de to_numpy para preservar la consistencia.
Referencia: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_numpy.html
fuente
Prueba esto:
Más información en: [ https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html] Válido para numpy 1.16.5 y pandas 0.25.2.
fuente