Pandas DataFrame zur Liste der Listen


113

Es ist einfach, eine Liste von Listen in einen Pandas-Datenrahmen umzuwandeln:

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

Aber wie verwandle ich df wieder in eine Liste von Listen?

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

Antworten:


173

Sie können auf das zugrunde liegende Array zugreifen und dessen tolistMethode aufrufen :

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

Warum werden Lin der Ausgabe s angehängt?
Kunal Vyas

1
L bedeutet lang, im Gegensatz zu int.
user48956

9
Ab Version 0.24 ist die Verwendung besserdf.to_numpy().tolist() .
CS95

1
HINWEIS: Dadurch wird die Spaltenreihenfolge nicht beibehalten. so achten Sie auf , dass
Russell Lego

3
Es gibt keinen Grund, warum die Spaltenreihenfolge nicht beibehalten wird.
Yohan Obadia

15

Wenn die Daten Spalten- und Indexbezeichnungen haben, die Sie beibehalten möchten, gibt es einige Optionen.

Beispieldaten:

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

Die tolist()in anderen Antworten beschriebene Methode ist nützlich, liefert jedoch nur die Kerndaten - was je nach Ihren Anforderungen möglicherweise nicht ausreicht.

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

Ein Ansatz besteht darin, das DataFramein json zu konvertieren df.to_json()und es dann erneut zu analysieren. Dies ist umständlich, hat jedoch einige Vorteile, da die to_json()Methode einige nützliche Optionen bietet.

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

Umständlich, kann aber nützlich sein.

Die gute Nachricht ist, dass es ziemlich einfach ist, Listen für die Spalten und Zeilen zu erstellen:

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

Dies ergibt:

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

Wenn der NoneName des Index störend ist, benennen Sie ihn um:

df = df.rename_axis('stage')

Dann:

>>> 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
Wenn Sie einen mehrstufigen Index haben, ist das Indextupel das erste Element der generierten Zeilen. Sie benötigen einen weiteren Schritt, um es zu teilen.
Konstantin

Wäre es nicht einfacher zu benutzen DataFrame.itertuples()oder DataFrame.to_records()für all das?
AMC

@AMC Vielleicht weiß ich es nicht, vielleicht? Warum nicht in Ihrer eigenen Antwort eine angemessene Behandlung dieses Gedankens hinzufügen, anstatt ein Pontifikat zu erstellen?
Andrew E

@ AndrewE Eh, es lohnt sich immer noch, bestehende Antworten zu diskutieren und zu verbessern.
AMC

5

Ich weiß nicht, ob es Ihren Bedürfnissen entspricht, aber Sie können auch:

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

Dies ist nur ein Numpy-Array aus dem ndarray-Modul, mit dem Sie alle üblichen Numpy-Array-Aufgaben ausführen können.


1
Plus 1. In der Praxis ist es häufig nicht erforderlich, das NumPy-Array in eine Liste von Listen zu konvertieren.
Jpp

5

Ich wollte den Index beibehalten und habe daher die ursprüngliche Antwort auf diese Lösung angepasst:

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

Jetzt können Sie es an einer anderen Stelle einfügen (z. B. um es in eine Stapelüberlauffrage einzufügen) und letztere neu erstellen:

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

2

Vielleicht hat sich etwas geändert, aber dies gab eine Liste von Ndarrays zurück, die das taten, was ich brauchte.

list(df.values)

1

Hinweis: Ich habe viele Fälle beim Stapelüberlauf gesehen, in denen das Konvertieren einer Pandas-Serie oder eines DataFrame in ein NumPy-Array oder einfache Python-Listen völlig unnötig ist. Wenn Sie neu in der Bibliothek sind, sollten Sie überprüfen, ob die von Ihnen benötigten Funktionen bereits von diesen Pandas-Objekten angeboten werden.

Um einen Kommentar von @jpp zu zitieren :

In der Praxis ist es häufig nicht erforderlich, das NumPy-Array in eine Liste von Listen zu konvertieren.


Wenn ein Pandas DataFrame / eine Pandas-Serie nicht funktioniert, können Sie die integrierten Methoden DataFrame.to_numpyund Series.to_numpyMethoden verwenden.


1
Diese Antwort repräsentiert kaum mehr als Ihre eigenen Überzeugungen. Und ehrlich gesagt ist es ein bisschen peinlich. Es gibt durchaus triftige Gründe, einen Datenrahmen in eine Liste / ein Array zu konvertieren, was ein fortgeschrittener Benutzer sicherlich wissen würde.
Nicolas Gervais

@NicolasGervais Es könnte ein bisschen zu viel sein, ja, ich werde es bearbeiten, um weniger zu verallgemeinern. Es gibt durchaus triftige Gründe, einen Datenrahmen in eine Liste / ein Array umzuwandeln. Natürlich sagt meine Antwort nicht wirklich etwas Gegenteiliges aus. Ein fortgeschrittener Benutzer würde es sicherlich wissen. Ich verstehe den Sinn dieses Stoßes nicht. Ich schrieb diese Antwort, nachdem ich bemerkt hatte, dass viele Leute Serien in ndarrays oder Listen und ndarrays in Listen konvertierten, einfach weil sie nicht wussten, welche Operationen diese Objekte unterstützen.
AMC

Ich beziehe mich auf sehr offensichtliche Fälle, wie zum Beispiel, for elem in some_series.values.tolist():weil sie nicht wissen, dass Sie über die Elemente einer Serie iterieren können. Ich bin mir nicht sicher, was an dieser Antwort so schrecklich ist.
AMC

0

Das ist sehr einfach:

import numpy as np

list_of_lists = np.array(df)

Wie unterscheidet sich das von DataFrame.valuesoder DataFrame.to_numpy()? Es ist egal, dass ein NumPy-Array erstellt wird, keine einfache Python-Liste.
AMC

-1

Wir können die DataFrame.iterrows () -Funktion verwenden, um über jede der Zeilen des angegebenen Datenrahmens zu iterieren und eine Liste aus den Daten jeder Zeile zu erstellen:

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

Wir können jede Zeile des angegebenen Datenrahmens erfolgreich in eine Liste extrahieren


Dies ist keine gute Idee. Vermeiden Sie die Verwendung von df.iterrows, da es anti-pattern und langsam ist, sobald der df groß wird: stackoverflow.com/questions/16476924/…
Derek O
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.