Pandas DataFrame para lista de listas

114

É fácil transformar uma lista de listas em um dataframe do pandas:

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

Mas como faço para transformar df de volta em uma lista de listas?

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

Respostas:

176

Você pode acessar a matriz subjacente e chamar seu tolistmétodo:

>>> df = pd.DataFrame([[1,2,3],[3,4,5]])
>>> lol = df.values.tolist()
>>> lol
[[1L, 2L, 3L], [3L, 4L, 5L]]
DSM
fonte
Por que há Ls anexados na saída?
Kunal Vyas de
1
L significa longo, ao contrário de int.
user48956
9
De v0.24 em diante, seria melhor usardf.to_numpy().tolist() .
cs95
1
NOTA, isso não preserva a ordem das colunas. portanto, fique atento a isso
Russell Lego
3
Não há motivo para não preservar a ordem das colunas.
Yohan Obadia
15

Se os dados tiverem rótulos de coluna e índice que você deseja preservar, existem algumas opções.

Dados de exemplo:

>>> 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

O tolist()método descrito em outras respostas é útil, mas produz apenas os dados principais - o que pode não ser suficiente, dependendo de suas necessidades.

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

Uma abordagem é converter o DataFramepara json usando df.to_json()e, em seguida, analisá-lo novamente. Isso é complicado, mas tem algumas vantagens, porque o to_json()método tem algumas opções úteis.

>>> 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]]
}

Pesado, mas pode ser útil.

A boa notícia é que é muito simples construir listas para as colunas e linhas:

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

Isso produz:

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

Se o Nonecomo o nome do índice for incômodo, renomeie-o:

df = df.rename_axis('stage')

Então:

>>> 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
fonte
1
Se você tiver um índice multinível, a tupla do índice será o primeiro elemento das linhas geradas. Você precisará de mais uma etapa para dividi-lo.
Konstantin
Não seria mais simples de usar DataFrame.itertuples()ou DataFrame.to_records()para tudo isso?
AMC
@AMC Talvez, não sei, talvez? Em vez de pontificar, por que não adicionar um tratamento adequado a esse pensamento em sua própria resposta?
Andrew E
@AndrewE Eh, ainda vale a pena discutir e melhorar as respostas existentes.
AMC
5

Não sei se atenderá às suas necessidades, mas você também pode fazer:

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

Este é apenas um array numpy do módulo ndarray, que permite que você faça todas as coisas normais do array numpy.

aps
fonte
1
Mais 1. Na prática , geralmente não há necessidade de converter a matriz NumPy em uma lista de listas.
jpp de
5

Eu queria preservar o índice, então adaptei a resposta original para esta solução:

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

Agora você pode colá-lo em outro lugar (por exemplo, para colar em uma pergunta do Stack Overflow) e depois recriá-lo:

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

Talvez algo tenha mudado, mas isso me deu uma lista de ndarrays que fazia o que eu precisava.

list(df.values)
Ian Rubenstein
fonte
1

Observação: eu vi muitos casos no Stack Overflow em que a conversão de uma série Pandas ou DataFrame em uma matriz NumPy ou listas Python simples é totalmente desnecessária. Se você é novo na biblioteca, considere verificar se a funcionalidade de que você precisa já é oferecida por esses objetos Pandas.

Para citar um comentário de @jpp:

Na prática , geralmente não há necessidade de converter a matriz NumPy em uma lista de listas.


Se um DataFrame / Series do Pandas não funcionar, você pode usar os métodos DataFrame.to_numpye integrados Series.to_numpy.

AMC
fonte
1
Essa resposta representa pouco mais do que suas próprias crenças. E, francamente, é um pouco constrangedor. Existem razões perfeitamente válidas para converter um dataframe em uma lista / array, um usuário avançado certamente sabe.
Nicolas Gervais
@NicolasGervais Pode ser um pouco demais, sim, vou editar para generalizar menos. Existem razões perfeitamente válidas para converter um dataframe em uma lista / array. Claro, minha resposta realmente não diz nada em contrário. um usuário avançado certamente saberia. Eu não vejo o propósito desse jab. Escrevi esta resposta depois de notar que muitas pessoas estavam convertendo séries em ndarrays ou listas e ndarrays em listas, simplesmente porque não sabiam quais operações esses objetos suportam.
AMC
Estou me referindo a casos muito flagrantes, como fazer for elem in some_series.values.tolist():porque eles não sabem que você pode iterar sobre os elementos de uma série. Não tenho certeza do que há de tão terrível nessa resposta.
AMC
0

Isso é muito simples:

import numpy as np

list_of_lists = np.array(df)
Tms91
fonte
Como isso é diferente de usar DataFrame.valuesou DataFrame.to_numpy()? Não importa o fato de que ele cria um array NumPy, não uma lista Python simples.
AMC
-1

Podemos usar a função DataFrame.iterrows () para iterar sobre cada uma das linhas do Dataframe fornecido e construir uma lista com os dados de cada linha:

# 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 extrair com sucesso cada linha do quadro de dados fornecido em uma lista

Ram Prajapati
fonte
Isso não é uma boa ideia, tente evitar o uso de df.iterrows porque é antipadrão e lento quando o df fica grande: stackoverflow.com/questions/16476924/…
Derek O,