¿Cómo obtengo una columna de DataFrame Index / Series como una matriz o lista?

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

Para obtener una matriz NumPy, debe usar el atributo de values :

 In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df AB 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'] 

Y similarmente, para columnas.

Puede usar df.index para acceder al objeto de índice y luego obtener los valores en una lista usando df.index.tolist() . De manera similar, puede usar df['col'].tolist() para Series.

Si está tratando con un dataframe de múltiples índices, es posible que le interese 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_index debe ser un elemento de df.index.names

Actual a partir de v0.24.0 + , 2019.

¡Deprede su uso de .values a favor de estos métodos!

A partir de v0.24.0, tendremos dos nuevos métodos preferidos para obtener matrices NumPy de los objetos Index , Series y DataFrame : son .array y to_numpy() . En cuanto al uso, los documentos mencionan:

No hemos eliminado o desaprobado Series.values o DataFrame.values , pero recomendamos encarecidamente usar en su lugar .array o .to_numpy() .

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


atributo de array
Este atributo devuelve un objeto ExtensionArray 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 AB a 1 2 b 4 5 

 df.index.array #  # ['a', 'b'] # Length: 2, dtype: object df['A'].array #  # [1, 4] # Length: 2, dtype: int64 

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

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

o, simplemente llame directamente a .tolist() :

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

Respecto a lo que se devuelve, mencionan los documentos

Para las Series e Index respaldados por matrices normales de NumPy, Series.array devolverá una nueva arrays.PandasArray . arrays.PandasArray , que es una envoltura delgada (sin copia) alrededor de una numpy.ndarray . arrays.PandasArray no es especialmente útil por sí solo, pero proporciona la misma interfaz que cualquier matriz de extensión definida en pandas o por una biblioteca de terceros.

Así que, para resumir, .array volverá o

  1. El ExtensionArray existente que respalda el Índice / Serie, o
  2. Si hay una matriz NumPy que respalda la serie, se crea un nuevo objeto ExtensionArray como un contenedor delgado sobre la matriz subyacente.

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 AB -1 1 2 b 4 5 

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

 v = df.index.to_numpy(copy=True) v[-1] = -123 df AB a 1 2 b 4 5 

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


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

Específicamente, los documentos mencionan el razonamiento:

[…] con .values no 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 una nueva ndarray de objetos de período cada vez. […]

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

Por último, .values no quedará en desuso en la versión actual, pero espero que esto ocurra en algún momento en el futuro, por lo que insto a los usuarios a migrar hacia la API más nueva, tan pronto como sea posible.

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

 df.index.get_values() 

dataframe el dataframe de dataframe pandas a la list y luego usé el list.index() básico. 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 .