Pandas DataFrame a la lista de listas


115

Es fácil convertir una lista de listas en un marco de datos de pandas:

import pandas as pd
df = pd.DataFrame([[1,2,3],[3,4,5]])

Pero, ¿cómo convierto df de nuevo en una lista de listas?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]

Respuestas:


177

Puede acceder a la matriz subyacente y llamar a su tolistmétodo:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]

¿Por qué se Lañaden s en la salida?
Kunal Vyas

1
L significa largo, a diferencia de int.
user48956

9
A partir de la versión 0.24, sería mejor usardf.to_numpy().tolist() .
cs95

1
NOTA, esto no preserva el orden de las columnas. así que ten cuidado con eso
Russell Lego

3
No hay ninguna razón por la que no conservaría el orden de las columnas.
Yohan Obadia

15

Si los datos tienen etiquetas de índice y columna que desea conservar, existen algunas opciones.

Datos de ejemplo:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]], \
       columns=('first', 'second', 'third'), \
       index=('alpha', 'beta')) 
>>> df
       first  second  third
alpha      1       2      3
beta       3       4      5

El tolist()método descrito en otras respuestas es útil, pero solo proporciona los datos básicos, que pueden no ser suficientes, según sus necesidades.

>>> df.values.tolist()
[[1, 2, 3], [3, 4, 5]]

Un enfoque es convertir el DataFramea json usando df.to_json()y luego analizarlo nuevamente. Esto es engorroso pero tiene algunas ventajas, porque el to_json()método tiene algunas opciones útiles.

>>> df.to_json()
{
  "first":{"alpha":1,"beta":3},
  "second":{"alpha":2,"beta":4},"third":{"alpha":3,"beta":5}
}

>>> df.to_json(orient='split')
{
 "columns":["first","second","third"],
 "index":["alpha","beta"],
 "data":[[1,2,3],[3,4,5]]
}

Es engorroso pero puede resultar útil.

La buena noticia es que es bastante sencillo crear listas para las columnas y filas:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> rows = [[i for i in row] for row in df.itertuples()]

Esto produce:

>>> print(f"columns: {columns}\nrows: {rows}") 
columns: [None, 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

Si el Nonenombre del índice es molesto, cámbiele el nombre:

df = df.rename_axis('stage')

Luego:

>>> columns = [df.index.name] + [i for i in df.columns]
>>> print(f"columns: {columns}\nrows: {rows}") 

columns: ['stage', 'first', 'second', 'third']
rows: [['alpha', 1, 2, 3], ['beta', 3, 4, 5]]

1
Si tiene un índice multinivel, la tupla de índice será el primer elemento de las filas generadas. Necesitará un paso más para dividirlo.
Konstantin

¿No sería más sencillo de usar DataFrame.itertuples()o DataFrame.to_records()para todo esto?
AMC

@AMC Quizás, no lo sé, ¿quizás? En lugar de pontificar, ¿por qué no agregar un tratamiento adecuado de ese pensamiento en su propia respuesta?
Andrew E

@AndrewE Eh, todavía vale la pena discutir y mejorar las respuestas existentes.
AMC

5

No sé si se ajustará a sus necesidades, pero también puede hacer:

>>> lol = df.values
>>> lol
array([[1, 2, 3],
       [3, 4, 5]])

Esta es solo una matriz numpy del módulo ndarray, que le permite hacer todas las cosas habituales de la matriz numpy.


1
Más 1. En la práctica , a menudo no es necesario convertir la matriz NumPy en una lista de listas.
jpp

5

Quería conservar el índice, así que adapté la respuesta original a esta solución:

list_df = df.reset_index().values.tolist()

Ahora puede pegarlo en otro lugar (por ejemplo, para pegarlo en una pregunta de Stack Overflow) y luego volver a crearlo:

pd.Dataframe(list_df, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)

2

Quizás algo cambió, pero esto devolvió una lista de ndarrays que hicieron lo que necesitaba.

list(df.values)

1

Nota: He visto muchos casos en Stack Overflow en los que convertir una serie Pandas o DataFrame en una matriz NumPy o listas simples de Python es completamente innecesario. Si es nuevo en la biblioteca, considere la posibilidad de verificar dos veces si esos objetos Pandas ya ofrecen la funcionalidad que necesita.

Para citar un comentario de @jpp:

En la práctica , a menudo no es necesario convertir la matriz NumPy en una lista de listas.


Si un DataFrame / Series de Pandas no funciona, puede usar los métodos DataFrame.to_numpyy incorporados Series.to_numpy.


1
Esta respuesta representa poco más que sus propias creencias. Y, francamente, es un poco embarazoso. Hay razones perfectamente válidas para convertir un marco de datos en una lista / matriz, un usuario avanzado sin duda lo sabría.
Nicolas Gervais

@NicolasGervais Puede que sea demasiado, sí, lo editaré para generalizar menos. Hay razones perfectamente válidas para convertir un marco de datos en una lista / matriz. Por supuesto, mi respuesta realmente no dice nada al contrario. un usuario avanzado sin duda lo sabría. No veo el sentido de ese jab. Escribí esta respuesta después de notar que muchas personas estaban convirtiendo series en ndarrays o listas, y ndarrays en listas, simplemente porque no sabían qué operaciones admiten esos objetos.
AMC

Me refiero a casos muy flagrantes, como hacerlo for elem in some_series.values.tolist():porque no saben que puedes iterar sobre los elementos de una serie. No estoy seguro de qué tiene de horrible esta respuesta.
AMC

0

Esto es muy simple:

import numpy as np

list_of_lists = np.array(df)

¿En qué se diferencia de usar DataFrame.valueso DataFrame.to_numpy()? No importa el hecho de que crea una matriz NumPy, no una lista simple de Python.
AMC

-1

Podemos usar la función DataFrame.iterrows () para iterar sobre cada una de las filas del Dataframe dado y construir una lista a partir de los datos de cada fila:

# Empty list 
row_list =[] 

# Iterate over each row 
for index, rows in df.iterrows(): 
    # Create list for the current row 
    my_list =[rows.Date, rows.Event, rows.Cost] 

    # append the list to the final list 
    row_list.append(my_list) 

# Print 
print(row_list) 

Podemos extraer con éxito cada fila del marco de datos dado en una lista


Esto no es una buena idea, trate de evitar el uso de df.iterrows porque es anti-patrón y lento una vez que el df se vuelve grande: stackoverflow.com/questions/16476924/…
Derek O
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.