435 Stimmen

Konvertieren Sie ein Pandas DataFrame in ein Dictionary

Ich habe ein DataFrame mit vier Spalten. Ich möchte dieses DataFrame in ein Python-Wörterbuch umwandeln. Ich möchte, dass die Elemente der ersten Spalte keys sind und die Elemente der anderen Spalten in der gleichen Zeile values sind.

DataFrame:

    ID   A   B   C
0   p    1   3   2
1   q    4   3   2
2   r    4   0   9 

Die Ausgabe sollte so aussehen:

{'p': [1,3,2], 'q': [4,3,2], 'r': [4,0,9]}

731voto

Alex Riley Punkte 150217

Die to_dict() Methode setzt die Spaltennamen als Schlüssel im Dictionary, sodass das DataFrame etwas umgestaltet werden muss. Indem Sie die 'ID'-Spalte als Index festlegen und dann das DataFrame transponieren, können Sie dies erreichen.

to_dict() akzeptiert auch ein 'orient'-Argument, das Sie benötigen, um eine Liste von Werten für jede Spalte auszugeben. Andernfalls wird für jede Spalte ein Dictionary der Form {Index: Wert} zurückgegeben.

Diese Schritte können mit der folgenden Zeile ausgeführt werden:

>>> df.set_index('ID').T.to_dict('list')
{'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}

Falls ein anderer Dictionary-Format benötigt wird, hier sind Beispiele für die möglichen 'orient'-Argumente. Berücksichtigen Sie das folgende einfache DataFrame:

>>> df = pd.DataFrame({'a': ['rot', 'gelb', 'blau'], 'b': [0.5, 0.25, 0.125]})
>>> df
        a      b
0     rot  0.500
1  gelb  0.250
2    blau  0.125

Dann sind die Optionen wie folgt.

dict - Standard: Spaltennamen sind Schlüssel, Werte sind Dictionarys von Index:Daten Paaren

>>> df.to_dict('dict')
{'a': {0: 'rot', 1: 'gelb', 2: 'blau'}, 
 'b': {0: 0.5, 1: 0.25, 2: 0.125}}

list - Schlüssel sind Spaltennamen, Werte sind Listen von Spaltendaten

>>> df.to_dict('list')
{'a': ['rot', 'gelb', 'blau'], 
 'b': [0.5, 0.25, 0.125]}

series - wie 'list', aber Werte sind Series

>>> df.to_dict('series')
{'a': 0       rot
      1    gelb
      2      blau
      Name: a, dtype: object, 

 'b': 0    0.500
      1    0.250
      2    0.125
      Name: b, dtype: float64}

split - Spaltet Spalten/Daten/Index als Schlüssel mit Werten, die Spaltennamen, Datenwerte pro Reihe und Indexbezeichnungen sind

>>> df.to_dict('split')
{'columns': ['a', 'b'],
 'data': [['rot', 0.5], ['gelb', 0.25], ['blau', 0.125]],
 'index': [0, 1, 2]}

records - Jede Zeile wird zu einem Dictionary, wobei der Schlüssel der Spaltenname und der Wert die Daten in der Zelle ist

>>> df.to_dict('records')
[{'a': 'rot', 'b': 0.5}, 
 {'a': 'gelb', 'b': 0.25}, 
 {'a': 'blau', 'b': 0.125}]

index - wie 'records', aber ein Dictionary von Dictionaries mit Schlüsseln als Indexbezeichnungen (anstelle einer Liste)

>>> df.to_dict('index')
{0: {'a': 'rot', 'b': 0.5},
 1: {'a': 'gelb', 'b': 0.25},
 2: {'a': 'blau', 'b': 0.125}}

172voto

Sollte ein Wörterbuch wie:

{'rot': '0,500', 'gelb': '0,250', 'blau': '0,125'}

aus einem DataFrame wie:

        a      b
0     rot  0,500
1  gelb  0,250
2    blau  0,125

erforderlich sein, wäre der einfachste Weg:

dict(df.values)

der funktionierende Ausschnitt unten:

import pandas as pd
df = pd.DataFrame({'a': ['rot', 'gelb', 'blau'], 'b': [0,5, 0,25, 0,125]})
dict(df.values)

37voto

Farhad Maleki Punkte 3057

Folgen Sie diesen Schritten:

Angenommen, Ihr DataFrame sieht wie folgt aus:

>>> df
   A  B  C ID
0  1  3  2  p
1  4  3  2  q
2  4  0  9  r

1. Verwenden Sie set_index, um die Spalte ID als Index des DataFrames festzulegen.

    df.set_index("ID", drop=True, inplace=True)

2. Verwenden Sie den Parameter orient=index, um den Index als Schlüssel des Wörterbuchs zu haben.

    dictionary = df.to_dict(orient="index")

Die Ergebnisse werden wie folgt sein:

    >>> dictionary
    {'q': {'A': 4, 'B': 3, 'D': 2}, 'p': {'A': 1, 'B': 3, 'D': 2}, 'r': {'A': 4, 'B': 0, 'D': 9}}

3. Wenn Sie jedes Sample als Liste haben möchten, führen Sie den folgenden Code aus. Bestimmen Sie die Spaltenreihenfolge

column_order= ["A", "B", "C"] #  Bestimmen Sie Ihre bevorzugte Spaltenreihenfolge
d = {} #  Initialisieren Sie das neue Wörterbuch als leeres Wörterbuch
for k in dictionary:
    d[k] = [dictionary[k][column_name] for column_name in column_order]

34voto

Versuchen Sie Zip zu verwenden

df = pd.read_csv("Datei")
d = dict([(i, [a, b, c ]) for i, a, b, c in zip(df.ID, df.A, df.B, df.C)])
print d

Ausgabe:

{'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}

14voto

Kamil Sindi Punkte 18862

Wenn es Ihnen nichts ausmacht, dass die Wörterbuchwerte Tupel sind, können Sie itertuples verwenden:

>>> {x[0]: x[1:] for x in df.itertuples(index=False)}
{'p': (1, 3, 2), 'q': (4, 3, 2), 'r': (4, 0, 9)}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X