2015-01-18 28 views
38

E 'facile trasformare una lista di liste in un dataframe panda:Pandas dataframe alla lista di liste

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

Ma come faccio a df di nuovo in una lista di liste?

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

lol a lol variabile –

risposta

67

Si potrebbe accedere alla matrice sottostante e chiamare il metodo tolist:

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

Perfetto. Grazie! – bumpkin

+0

Perché ci sono le 'L's aggiunte nell'output? –

+1

L mean long, al contrario di int. – user48956

2

Non so se si adatta alle vostre esigenze, ma si può anche fare:

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

Questa è solo una matrice numpy dal modulo ndarray, che ti permette di fare tutte le solite cose di array numpy.

3

Se i dati hanno etichette di colonne e indici che si desidera conservare, ci sono alcune opzioni.

dati 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 metodo tolist() descritto in altre risposte è utile, ma cede solo i dati di base - che non può essere sufficiente, a seconda delle esigenze.

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

Un approccio è quello di convertire il DataFrame a JSON utilizzando df.to_json() e quindi analizzare di nuovo. Questo è ingombrante ma presenta alcuni vantaggi, perché il metodo to_json() 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 per 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 None come il nome dell'indice è fastidioso, rinominarlo:

df = df.rename_axis('stage') 

Poi:

01.235.
>>> 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]] 
+0

Se si dispone di un indice multilivello, la tupla dell'indice sarà il primo elemento delle righe generate. Avrai bisogno di un ulteriore passaggio per dividerlo. – Konstantin