HOWTO · Pandas

Cómo convertir Pandas DataFrame en un array de NumPy

Convierta un DataFrame de Pandas en un array de NumPy con to_numpy(), incluya su índice o cree registros estructurados con to_records().

En esta página

Para obtener un array normal de NumPy, llama a DataFrame.to_numpy(). Si mantienes código antiguo, puedes usar la propiedad heredada DataFrame.values; si necesitas campos con nombre, elige DataFrame.to_records(). Los ejemplos usan datos fijos y requieren pandas y NumPy. Un array normal tiene un único dtype, por lo que los tipos de columna mixtos pueden representarse mediante un dtype común.

Usar DataFrame.to_numpy() para obtener un array de NumPy

to_numpy() devuelve los datos de la tabla como un array de NumPy bidimensional. Las filas conservan el orden del DataFrame y las columnas, el orden de sus columnas. La forma del array es (número de filas, número de columnas); no incluye el índice ni las etiquetas de columna del DataFrame. El objeto devuelto es un ndarray, por lo que las funciones posteriores de NumPy pueden utilizarlo directamente.

Este ejemplo crea una tabla pequeña, convierte sus valores e imprime el array, su forma y el tipo del resultado:

import pandas as pd

df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [91, 88]})
array = df.to_numpy()

print(array)
print(array.shape)
print(type(array))
[['Ada' 91]
 ['Lin' 88]]
(2, 2)
<class 'numpy.ndarray'>

Si necesitas un dtype concreto, pásalo mediante dtype= a to_numpy(), por ejemplo, df.to_numpy(dtype="float64"). Esto solicita a NumPy que convierta los valores a ese dtype; elige uno que pueda representar los valores de todas las columnas. Si se mezclan cadenas y números, un dtype numérico no puede representar todos los valores sin conversión, por lo que el dtype común predeterminado puede ser object.

Gestionar la propiedad heredada DataFrame.values e incluir el índice

DataFrame.values es una propiedad, así que se accede a ella sin paréntesis. Devuelve los datos tabulares como un array, pero to_numpy() hace explícita la conversión y es la forma recomendada para el código nuevo. El código existente que usa values puede seguir leyéndola como un atributo.

Para incluir los valores del índice como una columna, llama a reset_index() antes de convertir. De forma predeterminada, reset_index() coloca el índice anterior en la primera columna y crea un nuevo índice entero predeterminado. Renombra el índice antes si quieres que la columna tenga un nombre significativo. Consulta reset_index() para ver sus opciones.

import pandas as pd

df = pd.DataFrame({"score": [91, 88]}, index=["Ada", "Lin"])

legacy_array = df.values
with_index = df.reset_index().to_numpy()

print(legacy_array)
print(with_index)
[[91]
 [88]]
[['Ada' 91]
 ['Lin' 88]]

Como las etiquetas del índice son cadenas y los valores de puntuación son enteros, el array normal necesita un dtype común y puede usar object. El índice solo está presente después de llamar a reset_index(); al convertir el DataFrame original, sus etiquetas quedan fuera. Usa un array de registros estructurado cuando necesites acceder por separado a los tipos y nombres de las columnas.

Usar DataFrame.to_records() para obtener un array estructurado de NumPy

to_records() devuelve un array estructurado de NumPy con un campo con nombre para cada columna del DataFrame. De forma predeterminada, también incluye el índice en un campo llamado index. El acceso a los campos permite identificar las columnas por nombre, y el dtype estructurado registra sus tipos individuales. Esto resulta útil cuando el código necesita seleccionar un campo por su nombre en lugar de depender de la posición de la columna.

import pandas as pd

df = pd.DataFrame({"name": ["Ada", "Lin"], "score": [91, 88]})
records = df.to_records()

print(records["name"])
print(records["score"])
print(records.dtype.names)
['Ada' 'Lin']
[91 88]
('index', 'name', 'score')

Establece index=False para omitir el índice o proporciona index_dtypes= si necesitas especificar el dtype del campo del índice. Elige to_numpy() para obtener un array convencional y to_records() cuando la tarea requiera campos con nombre o información sobre el dtype de cada columna.