Pandas DataFrame in List of Lists


115

È facile trasformare un elenco di elenchi in un dataframe panda:

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

Ma come faccio a trasformare nuovamente df in un elenco di elenchi?

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

Risposte:


177

È possibile accedere all'array sottostante e chiamare il suo tolistmetodo:

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

Perché Lnell'output sono presenti messaggi di posta elettronica?
Kunal Vyas

1
L significa lungo, al contrario di int.
user48956


1
NOTA, ciò non preserva l'ordine delle colonne. quindi attenzione per quello
Russell Lego

3
Non c'è motivo per cui non manterrebbe l'ordine delle colonne.
Yohan Obadia

15

Se i dati hanno etichette di colonna e indice che vuoi conservare, ci sono alcune opzioni.

Dati di esempio:

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

Il tolist()metodo descritto in altre risposte è utile ma fornisce solo i dati principali, che potrebbero non essere sufficienti, a seconda delle esigenze.

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

Un approccio consiste nel convertire il file DataFramein json utilizzando df.to_json()e quindi analizzarlo di nuovo. Questo è complicato ma presenta alcuni vantaggi, perché il to_json()metodo ha alcune opzioni utili.

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

Ingombrante ma può essere utile.

La buona notizia è che è abbastanza semplice creare elenchi per le colonne e le righe:

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

Questo produce:

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

Se il Nonenome dell'indice è fastidioso, rinominalo:

df = df.rename_axis('stage')

Poi:

>>> 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
Se hai un indice multilivello, la tupla dell'indice sarà il primo elemento delle righe generate. Avrai bisogno di un ulteriore passaggio per dividerlo.
Konstantin

Non sarebbe più semplice da usare DataFrame.itertuples()o DataFrame.to_records()per tutto questo?
AMC

@ AMC Forse, non lo so, forse? Piuttosto che pontificare, perché non aggiungere un trattamento appropriato di quel pensiero nella tua risposta?
Andrew E,

@AndrewE Eh, vale ancora la pena discutere e migliorare le risposte esistenti.
AMC

5

Non so se soddisferà le tue esigenze, ma puoi anche fare:

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

Questo è solo un array numpy dal modulo ndarray, che ti permette di fare tutte le solite cose dell'array numpy.


1
Plus 1. In pratica , spesso non è necessario convertire l'array NumPy in un elenco di elenchi.
jpp

5

Volevo preservare l'indice, quindi ho adattato la risposta originale a questa soluzione:

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

Ora puoi incollarlo da qualche altra parte (ad esempio per incollarlo in una domanda Stack Overflow) e poi ricrearlo:

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

2

Forse qualcosa è cambiato, ma questo ha restituito un elenco di ndarrays che hanno fatto ciò di cui avevo bisogno.

list(df.values)

1

Nota: ho visto molti casi su Stack Overflow in cui la conversione di una serie Pandas o DataFrame in un array NumPy o in semplici elenchi Python non è del tutto necessaria. Se sei nuovo nella libreria, considera di ricontrollare se la funzionalità di cui hai bisogno è già offerta da quegli oggetti Pandas.

Per citare un commento di @jpp:

In pratica , spesso non è necessario convertire l'array NumPy in un elenco di elenchi.


Se un DataFrame / serie di Pandas non funziona, puoi utilizzare i metodi DataFrame.to_numpye incorporati Series.to_numpy.


1
Questa risposta rappresenta poco più delle tue convinzioni. E francamente, è un po 'imbarazzante. Ci sono ragioni perfettamente valide per convertire un dataframe in un elenco / array, un utente avanzato lo saprebbe sicuramente.
Nicolas Gervais

@NicolasGervais Potrebbe essere un po 'troppo, sì, lo modifico per generalizzare di meno. Ci sono ragioni perfettamente valide per convertire un dataframe in un elenco / array Ovviamente, la mia risposta non dice nulla in contrario. un utente avanzato lo saprebbe sicuramente. Non vedo il punto di quel colpo. Ho scritto questa risposta dopo aver notato che molte persone stavano convertendo le serie in ndarrays o liste e ndarrays in liste, semplicemente perché non erano a conoscenza di quali operazioni supportano quegli oggetti.
AMC

Mi riferisco a casi molto evidenti, come fare for elem in some_series.values.tolist():perché non sanno che puoi iterare sugli elementi di una serie. Non sono sicuro di cosa sia così orribile in questa risposta.
AMC

0

Questo è molto semplice:

import numpy as np

list_of_lists = np.array(df)

In che modo è diverso dall'uso di DataFrame.valueso DataFrame.to_numpy()? Non importa il fatto che crea un array NumPy, non un semplice elenco Python.
AMC

-1

Possiamo usare la funzione DataFrame.iterrows () per iterare su ciascuna delle righe del Dataframe dato e costruire un elenco dai dati di ogni riga:

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

Possiamo estrarre con successo ogni riga del data frame dato in un elenco


Questa non è una buona idea, cerca di evitare di usare df.iterrows perché è anti-pattern e lento una volta che il df diventa grande: stackoverflow.com/questions/16476924/…
Derek O
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.