¿Cómo convierto una serie o índice de pandas en una matriz Numpy?

264

¿Sabes cómo obtener el índice o la columna de un DataFrame como una matriz NumPy o una lista de Python?

ericmjl
fuente
¿Responde esto a tu pregunta? Convierta el marco de datos de pandas a la matriz NumPy
AMC
1
NOTA: Tener que convertir Pandas DataFrame a una matriz (o lista) como esta puede ser indicativo de otros problemas. Recomiendo encarecidamente asegurarse de que un DataFrame es la estructura de datos adecuada para su caso de uso particular, y que Pandas no incluye ninguna forma de realizar las operaciones que le interesan.
AMC

Respuestas:

354

Para obtener una matriz NumPy, debe usar el valuesatributo:

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

Esto accede a cómo los datos ya están almacenados, por lo que no hay necesidad de una conversión.
Nota: Este atributo también está disponible para muchos otros objetos de pandas.

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

Para obtener el índice como una lista, llame a tolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

Y de manera similar, para columnas.

Andy Hayden
fuente
Nota: .valuesestá en desuso, .to_numpy()es el reemplazo sugerido si desea una matriz NumPy. ¿Puede expandirse en Esto accede a cómo los datos ya están almacenados, por lo que no hay necesidad de una conversión ?
AMC
La respuesta por CS95 da una gran explicación de .values, .to_numpy()y .array.
AMC
75

Se puede utilizar df.indexpara acceder al objeto de índice y luego obtener los valores de una lista usando df.index.tolist(). Del mismo modo, puede usar df['col'].tolist()para Series.

bdiamante
fuente
Devuelve instanceMethod y no un conjunto de listas
V Shreyas
12
@VShreyas, ¿qué taldf.index.values.tolist()
LancelotHolmes
3
df.index.tolist()no devuelve un método de instancia. Devuelve una lista de índices. Es un método definido en el índice de pandas. Si bien llamar primero a los valores es una posibilidad, delegar el trabajo en numpy no es una corrección, solo una alternativa.
ayhan
51

pandas> = 0.24

¡Desprecia tu uso .valuesa favor de estos métodos!

De v0.24.0 en adelante, vamos a tener dos nuevos, los métodos preferidos de marca nalgadas para la obtención de las matrices de NumPy Index, Seriesy DataFrameobjetos: son to_numpy(), y .array. Con respecto al uso, los documentos mencionan:

No hemos eliminado o desaprobado Series.valueso DataFrame.values, pero recomendamos y utilizamos .arrayo en su .to_numpy()lugar.

Consulte esta sección de las notas de la versión v0.24.0 para obtener más información.


to_numpy() Método

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

Por defecto, se devuelve una vista. Cualquier modificación realizada afectará al original.

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

Si necesita una copia, use to_numpy(copy=True);

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

Tenga en cuenta que esta función también funciona para DataFrames (mientras .arrayque no).


arrayAtributo
Este atributo devuelve unExtensionArrayobjeto que respalda el Índice / Serie.

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

Desde aquí, es posible obtener una lista usando list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

o, simplemente llame directamente .tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

Con respecto a lo que se devuelve, los documentos mencionan:

For Seriesy Indexes respaldado por matrices NumPy normales, Series.array devolverá un nuevo arrays.PandasArray, que es un envoltorio delgado (sin copia) alrededor de a numpy.ndarray. arrays.PandasArrayno es especialmente útil por sí solo, pero proporciona la misma interfaz que cualquier conjunto de extensiones definido en pandas o por una biblioteca de terceros.

Entonces, para resumir, .arraydevolverá

  1. El ExtensionArrayrespaldo existente del Índice / Serie, o
  2. Si hay una matriz NumPy que respalda la serie, ExtensionArrayse crea un nuevo objeto como una envoltura delgada sobre la matriz subyacente.

Justificación para agregar DOS métodos nuevos
Estas funciones se agregaron como resultado de discusiones bajo dos temas de GitHub GH19954 y GH23623 .

Específicamente, los documentos mencionan la justificación:

[...] .valuesno estaba claro si el valor devuelto sería la matriz real, alguna transformación de la misma o una de las matrices personalizadas de pandas (como Categorical). Por ejemplo, con PeriodIndex, .values genera un nuevo ndarrayperíodo de objetos cada vez. [...]

Estas dos funciones apuntan a mejorar la consistencia de la API, que es un paso importante en la dirección correcta.

Por último, .valuesno 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.

cs95
fuente
48

Si se trata de un marco de datos de índice múltiple, puede interesarle extraer solo la columna de un nombre del índice múltiple. Puedes hacer esto como

df.index.get_level_values('name_sub_index')

y, por supuesto, name_sub_indexdebe ser un elemento de laFrozenList df.index.names

gg349
fuente
16

Desde pandas v0.13 también puedes usar get_values:

df.index.get_values()
yemu
fuente
55
¿Hay alguna diferencia entre esto y .valores? (Actualicé la información de la versión, ya que esta función aparece en los documentos 0.13.0.)
Andy Hayden
@Andy Hayden: ¿No es una diferencia que .get_values ​​sea la forma oficial de obtener solo los valores actuales, mientras que .values ​​(por ejemplo, en un índice múltiple) puede devolver valores de índice para los que se han eliminado las filas o columnas?
Ezekiel Kruglick
@EzekielKruglick, ¿siempre es una copia? El enlace a la documentación es muy ligero, ¡no pensé que obtuvieras engaños como ese (incluso si están en el MI no estarán en los valores.) Sería genial ver un ejemplo que lo demuestre!
Andy Hayden
@AndyHayden: Creo que estaba leyendo mal tu comentario. Tienes razón, .values ​​es bueno, .level da obsoletos y get_values ​​te da los valores actuales correctamente, excluyendo filas / columnas caídas. Problema original de github: github.com/pydata/pandas/issues/3686 Pero acabo de comprobar y parece que .values ​​(¡por supuesto!) Da información actualizada solo de una forma diferente de lo que pensé que era de lo que estábamos hablando
Ezekiel Kruglick
1
@AndyHayden No, no hay diferencia. get_valuessolo llama .values. Son más caracteres para escribir.
cs95
0

Convertí los pandas dataframea listy luego se usa el básico list.index(). Algo como esto:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

Tienes tu valor de índice como idx.

Sarvagya Gupta
fuente
y luego usé el list.index básico () ¿Cómo se relaciona eso con la cuestión de convertir una Serie en una lista?
AMC
0

Una forma más reciente de hacer esto es usar la función .to_numpy ().

Si tengo un marco de datos con una columna 'precio', puedo convertirlo de la siguiente manera:

priceArray = df['price'].to_numpy()

También puede pasar el tipo de datos, como flotante u objeto, como argumento de la función

Jon R
fuente
-1

A continuación se muestra una forma sencilla de convertir la columna del marco de datos en una matriz numpy.

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpy es una matriz numpy.

Intenté con, to.numpy()pero me dio el siguiente error: TypeError: no hay conversión compatible para los tipos: (dtype ('O'),) mientras hacía la clasificación de relevancia binaria usando SVC lineal. to.numpy () estaba convirtiendo el dataFrame en una matriz numpy, pero el tipo de datos del elemento interno estaba en la lista debido a que se observó el error anterior.

Kumar Shubham
fuente
Intenté con to.numpy () pero me dio el siguiente error: TypeError: no hay conversión compatible para los tipos: (dtype ('O'),) mientras hacía la clasificación de Relevancia Binaria usando Linear SVC. to.numpy () estaba convirtiendo el dataFrame en una matriz numpy, pero el tipo de datos del elemento interno estaba en la lista debido a que se observó el error anterior. Sin to_numpyembargo, eso no es realmente la culpa .
AMC