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 14
b 25
c 36In[2]: df.index.valuesOut[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.
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.
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.
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á
El ExtensionArrayrespaldo existente del Índice / Serie, o
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.
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 laFrozenListdf.index.names
¿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])
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.
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 .
Respuestas:
Para obtener una matriz NumPy, debe usar el
values
atributo: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.
Para obtener el índice como una lista, llame a
tolist
:Y de manera similar, para columnas.
fuente
.values
está 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 ?.values
,.to_numpy()
y.array
.Se puede utilizar
df.index
para acceder al objeto de índice y luego obtener los valores de una lista usandodf.index.tolist()
. Del mismo modo, puede usardf['col'].tolist()
para Series.fuente
df.index.values.tolist()
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.pandas> = 0.24
¡Desprecia tu uso
.values
a 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
,Series
yDataFrame
objetos: sonto_numpy()
, y.array
. Con respecto al uso, los documentos mencionan:Consulte esta sección de las notas de la versión v0.24.0 para obtener más información.
to_numpy()
MétodoPor defecto, se devuelve una vista. Cualquier modificación realizada afectará al original.
Si necesita una copia, use
to_numpy(copy=True
);Tenga en cuenta que esta función también funciona para DataFrames (mientras
.array
que no).array
AtributoEste atributo devuelve un
ExtensionArray
objeto que respalda el Índice / Serie.Desde aquí, es posible obtener una lista usando
list
:o, simplemente llame directamente
.tolist()
:Con respecto a lo que se devuelve, los documentos mencionan:
Entonces, para resumir,
.array
devolveráExtensionArray
respaldo existente del Índice / Serie, oExtensionArray
se 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:
Estas dos funciones apuntan a 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 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.fuente
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
y, por supuesto,
name_sub_index
debe ser un elemento de laFrozenList
df.index.names
fuente
Desde pandas v0.13 también puedes usar
get_values
:fuente
get_values
solo llama.values
. Son más caracteres para escribir.Convertí los pandas
dataframe
alist
y luego se usa el básicolist.index()
. Algo como esto:Tienes tu valor de índice como
idx
.fuente
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:
También puede pasar el tipo de datos, como flotante u objeto, como argumento de la función
fuente
A continuación se muestra una forma sencilla de convertir la columna del marco de datos en una matriz numpy.
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.fuente
to_numpy
embargo, eso no es realmente la culpa .