Pandas DataFrame a lista de listas

Resuelto bumpkin asked hace 9 años • 14 respuestas

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 vuelvo a convertir df en una lista de listas?

lol = df.what_to_do_now?
print lol
# [[1,2,3],[3,4,5]]
bumpkin avatar Jan 18 '15 10:01 bumpkin
Aceptado

Podrías 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]]
DSM avatar Jan 18 '2015 03:01 DSM

Si los datos tienen etiquetas de índice y de 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 archivo DataFramea json 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]]
}

Engorroso pero puede resultar útil.

La buena noticia es que es bastante sencillo crear listas para 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 le resulta molesto, cámbiele el nombre:

df = df.rename_axis('stage')

Entonces:

>>> 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]]
Andrew E avatar Nov 14 '2017 05:11 Andrew E

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

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

Ahora puedes pegarlo en otro lugar (por ejemplo, pegarlo en una pregunta de Stack Overflow) y luego recrearlo:

pd.Dataframe(list_df, columns=['name1', ...])
pd.set_index(['name1'], inplace=True)
neves avatar Oct 03 '2018 14:10 neves

No sé si se ajustará a tus necesidades, pero también puedes 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.

aps avatar Jan 18 '2015 03:01 aps

Tuve este problema: ¿cómo puedo hacer para que los encabezados del df estén en la fila 0 para escribirlos en la fila 1 en Excel (usando xlsxwriter)? Ninguna de las soluciones propuestas funcionó, pero me indicaron la dirección correcta. Sólo necesitaba una línea más de código.

# get csv data
df = pd.read_csv(filename)

# combine column headers and list of lists of values
lol = [df.columns.tolist()] + df.values.tolist()
Jondalar avatar Apr 17 '2021 14:04 Jondalar