Wie konvertiere ich eine Liste von Wörterbüchern in einen Pandas DataFrame?
Die anderen Antworten sind richtig, aber es wurde nicht viel über die Vor- und Nachteile dieser Methoden erklärt. Das Ziel dieses Beitrags ist es, Beispiele für diese Methoden in verschiedenen Situationen zu zeigen, zu diskutieren, wann sie verwendet werden sollen (und wann nicht) und Alternativen vorzuschlagen.
Abhängig von der Struktur und dem Format Ihrer Daten gibt es Situationen, in denen entweder alle drei Methoden funktionieren oder einige besser funktionieren als andere oder einige überhaupt nicht funktionieren.
Betrachten Sie ein sehr ausgeklügeltes Beispiel.
np.random.seed(0)
data = pd.DataFrame(
np.random.choice(10, (3, 4)), columns=list('ABCD')).to_dict('r')
print(data)
[{'A': 5, 'B': 0, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'C': 3, 'D': 5},
{'A': 2, 'B': 4, 'C': 7, 'D': 6}]
Diese Liste besteht aus "Datensätzen" mit allen vorhandenen Schlüsseln. Dies ist der einfachste Fall, dem Sie begegnen könnten.
# The following methods all produce the same output.
pd.DataFrame(data)
pd.DataFrame.from_dict(data)
pd.DataFrame.from_records(data)
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
Wort zur Wörterbuchorientierung: orient='index'
/'columns'
Bevor Sie fortfahren, ist es wichtig, zwischen den verschiedenen Arten von Wörterbuchorientierungen und der Unterstützung durch Pandas zu unterscheiden. Es gibt zwei Haupttypen: "Spalten" und "Index".
orient='columns'
Bei Wörterbüchern mit der Ausrichtung "Spalten" entsprechen die Schlüssel den Spalten im entsprechenden DataFrame.
Zum Beispiel ist data
oben in der "Spalten" Orientierung.
data_c = [
{'A': 5, 'B': 0, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'C': 3, 'D': 5},
{'A': 2, 'B': 4, 'C': 7, 'D': 6}]
pd.DataFrame.from_dict(data_c, orient='columns')
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
Hinweis: Wenn Sie verwenden pd.DataFrame.from_records
, wird angenommen, dass die Ausrichtung "Spalten" ist (Sie können nichts anderes angeben), und die Wörterbücher werden entsprechend geladen.
orient='index'
Bei dieser Ausrichtung wird angenommen, dass Schlüssel Indexwerten entsprechen. Diese Art von Daten ist am besten geeignet für pd.DataFrame.from_dict
.
data_i ={
0: {'A': 5, 'B': 0, 'C': 3, 'D': 3},
1: {'A': 7, 'B': 9, 'C': 3, 'D': 5},
2: {'A': 2, 'B': 4, 'C': 7, 'D': 6}}
pd.DataFrame.from_dict(data_i, orient='index')
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
Dieser Fall wird im OP nicht berücksichtigt, ist aber dennoch nützlich zu wissen.
Benutzerdefinierten Index festlegen
Wenn Sie einen benutzerdefinierten Index für den resultierenden DataFrame benötigen, können Sie ihn mithilfe des index=...
Arguments festlegen .
pd.DataFrame(data, index=['a', 'b', 'c'])
# pd.DataFrame.from_records(data, index=['a', 'b', 'c'])
A B C D
a 5 0 3 3
b 7 9 3 5
c 2 4 7 6
Dies wird von nicht unterstützt pd.DataFrame.from_dict
.
Umgang mit fehlenden Schlüsseln / Spalten
Alle Methoden funktionieren sofort, wenn Wörterbücher mit fehlenden Schlüssel- / Spaltenwerten verarbeitet werden. Zum Beispiel,
data2 = [
{'A': 5, 'C': 3, 'D': 3},
{'A': 7, 'B': 9, 'F': 5},
{'B': 4, 'C': 7, 'E': 6}]
# The methods below all produce the same output.
pd.DataFrame(data2)
pd.DataFrame.from_dict(data2)
pd.DataFrame.from_records(data2)
A B C D E F
0 5.0 NaN 3.0 3.0 NaN NaN
1 7.0 9.0 NaN NaN NaN 5.0
2 NaN 4.0 7.0 NaN 6.0 NaN
Teilmenge der Spalten lesen
"Was ist, wenn ich nicht in jeder einzelnen Spalte lesen möchte?" Sie können dies einfach mit dem columns=...
Parameter angeben .
Wenn Sie beispielsweise aus dem data2
obigen Beispielwörterbuch nur die Spalten "A", "D" und "F" lesen möchten, können Sie dies tun, indem Sie eine Liste übergeben:
pd.DataFrame(data2, columns=['A', 'D', 'F'])
# pd.DataFrame.from_records(data2, columns=['A', 'D', 'F'])
A D F
0 5.0 3.0 NaN
1 7.0 NaN 5.0
2 NaN NaN NaN
Dies wird von pd.DataFrame.from_dict
den Standardausrichtungsspalten nicht unterstützt .
pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])
ValueError: cannot use columns parameter with orient='columns'
Teilmenge der Zeilen lesen
Wird von keiner dieser Methoden direkt unterstützt . Sie müssen Ihre Daten durchlaufen und beim Iterieren an Ort und Stelle einen umgekehrten Löschvorgang durchführen . Zum Beispiel extrahieren nur die 0 - ten und 2 nd Reihen von data2
oben, können Sie:
rows_to_select = {0, 2}
for i in reversed(range(len(data2))):
if i not in rows_to_select:
del data2[i]
pd.DataFrame(data2)
# pd.DataFrame.from_dict(data2)
# pd.DataFrame.from_records(data2)
A B C D E
0 5.0 NaN 3 3.0 NaN
1 NaN 4.0 7 NaN 6.0
Das Allheilmittel: json_normalize
für verschachtelte Daten
Eine starke, robuste Alternative zu den oben beschriebenen Methoden ist die json_normalize
Funktion, die mit Listen von Wörterbüchern (Datensätzen) arbeitet und darüber hinaus auch verschachtelte Wörterbücher verarbeiten kann.
pd.io.json.json_normalize(data)
A B C D
0 5 0 3 3
1 7 9 3 5
2 2 4 7 6
pd.io.json.json_normalize(data2)
A B C D E
0 5.0 NaN 3 3.0 NaN
1 NaN 4.0 7 NaN 6.0
Beachten Sie auch hier, dass die an übergebenen Daten json_normalize
im Format der Liste der Wörterbücher (Datensätze) vorliegen müssen.
Wie bereits erwähnt, json_normalize
können auch verschachtelte Wörterbücher verarbeitet werden. Hier ist ein Beispiel aus der Dokumentation.
data_nested = [
{'counties': [{'name': 'Dade', 'population': 12345},
{'name': 'Broward', 'population': 40000},
{'name': 'Palm Beach', 'population': 60000}],
'info': {'governor': 'Rick Scott'},
'shortname': 'FL',
'state': 'Florida'},
{'counties': [{'name': 'Summit', 'population': 1234},
{'name': 'Cuyahoga', 'population': 1337}],
'info': {'governor': 'John Kasich'},
'shortname': 'OH',
'state': 'Ohio'}
]
pd.io.json.json_normalize(data_nested,
record_path='counties',
meta=['state', 'shortname', ['info', 'governor']])
name population state shortname info.governor
0 Dade 12345 Florida FL Rick Scott
1 Broward 40000 Florida FL Rick Scott
2 Palm Beach 60000 Florida FL Rick Scott
3 Summit 1234 Ohio OH John Kasich
4 Cuyahoga 1337 Ohio OH John Kasich
Weitere Informationen zu meta
und record_path
Argumenten finden Sie in der Dokumentation.
Zusammenfassen
Hier finden Sie eine Tabelle aller oben beschriebenen Methoden sowie die unterstützten Features / Funktionen.
* Verwenden Sie orient='columns'
und transponieren Sie, um den gleichen Effekt wie zu erzielen orient='index'
.