Konvertieren Sie Python-Diktat in einen Datenrahmen

299

Ich habe ein Python-Wörterbuch wie das folgende:

{u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

Die Schlüssel sind Unicode- Daten und die Werte sind Ganzzahlen. Ich möchte dies in einen Pandas-Datenrahmen konvertieren, indem ich die Daten und ihre entsprechenden Werte als zwei separate Spalten habe. Beispiel: col1: Dates col2: DateValue (die Daten sind immer noch Unicode und die Datumswerte sind immer noch ganze Zahlen)

     Date         DateValue
0    2012-07-01    391
1    2012-07-02    392
2    2012-07-03    392
.    2012-07-04    392
.    ...           ...
.    ...           ...

Jede Hilfe in diese Richtung wäre sehr dankbar. Ich kann keine Ressourcen in den Pandas-Dokumenten finden, die mir dabei helfen.

Ich weiß, dass eine Lösung darin bestehen könnte, jedes Schlüssel-Wert-Paar in diesem Diktat in ein Diktat umzuwandeln, sodass die gesamte Struktur zu einem Diktat von Diktaten wird, und dann können wir jede Zeile einzeln zum Datenrahmen hinzufügen. Aber ich möchte wissen, ob es einen einfacheren und direkteren Weg gibt, dies zu tun.

Bisher habe ich versucht, das Diktat in ein Serienobjekt umzuwandeln, aber dies scheint die Beziehung zwischen den Spalten nicht aufrechtzuerhalten:

s  = Series(my_dict,index=my_dict.keys())
anonuser0428
quelle
Ich habe versucht, das Diktat in ein Serienobjekt mit den Daten als Index zu konvertieren, aber das hat die Daten aus irgendeinem Grund nicht mit den entsprechenden Werten abgeglichen.
anonuser0428
Der Code wurde veröffentlicht. Ich möchte fragen, ob es eine Möglichkeit gibt, einen Datenrahmen zu erstellen, ohne ein Diktat zu erstellen und dann jede Zeile separat hinzuzufügen.
anonuser0428
1
Was ist ein "Unicode-Datum"? Meinen Sie ein ISO 8601- Datum?
Peter Mortensen

Antworten:

461

Der Fehler hier besteht darin, dass der DataFrame-Konstruktor mit skalaren Werten aufgerufen wird (wobei erwartet wird, dass die Werte eine Liste / dict / ... sind, dh mehrere Spalten haben):

pd.DataFrame(d)
ValueError: If using all scalar values, you must must pass an index

Sie können die Elemente aus dem Wörterbuch (dh die Schlüssel-Wert-Paare) entnehmen:

In [11]: pd.DataFrame(d.items())  # or list(d.items()) in python 3
Out[11]:
             0    1
0   2012-07-02  392
1   2012-07-06  392
2   2012-06-29  391
3   2012-06-28  391
...

In [12]: pd.DataFrame(d.items(), columns=['Date', 'DateValue'])
Out[12]:
          Date  DateValue
0   2012-07-02        392
1   2012-07-06        392
2   2012-06-29        391

Aber ich denke, es ist sinnvoller, den Serienkonstruktor zu bestehen:

In [21]: s = pd.Series(d, name='DateValue')
Out[21]:
2012-06-08    388
2012-06-09    388
2012-06-10    388

In [22]: s.index.name = 'Date'

In [23]: s.reset_index()
Out[23]:
          Date  DateValue
0   2012-06-08        388
1   2012-06-09        388
2   2012-06-10        388
Andy Hayden
quelle
4
@ user1009091 Ich habe erkannt, was der Fehler jetzt bedeutet. Im Grunde heißt es: "Was ich sehe, ist eine Serie, also benutze den Serienkonstruktor."
Andy Hayden
1
Danke - sehr hilfreich. Können Sie vielleicht erklären, was der Unterschied zwischen der Verwendung dieser Methode und der Verwendung von DataFrame.from_dict () ist? Ihre Methode (die ich verwendet habe) gibt type = pandas.core.frame.DataFrame zurück, während die andere type = class 'pandas.core.frame.DataFrame' zurückgibt. Gibt es eine Chance, den Unterschied zu erklären und wann jede Methode angemessen ist? Vielen Dank im Voraus :)
Optimesh
sie sind beide ähnlich, from_dicthaben ein orient kwarg, also könnte ich es verwenden, wenn ich das transponieren vermeiden wollte. Es gibt nur wenige Optionen from_dict, unter der Haube unterscheidet es sich nicht wirklich von der Verwendung des DataFrame-Konstruktors.
Andy Hayden
54
Ich sehe pandas.core.common.PandasError: DataFrame constructor not properly called!aus dem ersten Beispiel
allthesignals
18
@allthesignals Hinzufügen von list () um d.items funktioniert: pd.DataFrame (list (d.items ()), column = ['Date', 'DateValue'])
sigurdb
141

Wenn Sie ein Wörterbuch in einen Pandas-Datenrahmen konvertieren, bei dem die Schlüssel die Spalten des Datenrahmens und die Werte die Zeilenwerte sein sollen, können Sie das Wörterbuch einfach wie folgt in Klammern setzen:

>>> dict_ = {'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3'}
>>> pd.DataFrame([dict_])

    key 1     key 2     key 3
0   value 1   value 2   value 3

Es hat mir einige Kopfschmerzen erspart und ich hoffe, es hilft jemandem da draußen!

BEARBEITEN: In den Pandas-Dokumenten ist eine Option für den dataParameter im DataFrame-Konstruktor eine Liste von Wörterbüchern. Hier übergeben wir eine Liste mit einem Wörterbuch.

cheevahagadog
quelle
6
Ja, ich habe das auch getan, aber .T hinzugefügt, um zu transponieren.
Anton vBR
1
Es funktioniert gut, aber ich weiß nicht, warum wir es so machen müssen.
Hui Chen
Was passiert , wenn man diese Spalte wollen als Index verwendet werden
om tripathi
102

Wie in einer anderen Antwort erläutert, funktioniert die pandas.DataFrame()direkte Verwendung hier nicht so, wie Sie denken.

Was Sie tun können, ist zu verwenden pandas.DataFrame.from_dictmit orient='index':

In[7]: pandas.DataFrame.from_dict({u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 .....
 u'2012-07-05': 392,
 u'2012-07-06': 392}, orient='index', columns=['foo'])
Out[7]: 
            foo
2012-06-08  388
2012-06-09  388
2012-06-10  388
2012-06-11  389
2012-06-12  389
........
2012-07-05  392
2012-07-06  392
ntg
quelle
1
Können wir dies mit einer beliebigen renameMethode verketten, um auch die Namen des Index und der Spalten auf einmal festzulegen?
Ciprian Tomoiagă
4
guter Punkt. Ein Beispiel wäre: ...., orient = 'index'). Rename (Spalten = {0: 'foobar'})
ntg
1
Sie können auch pandas.DataFrame.from_dict (..., orient = 'index', columns = ['foo', 'bar']) angeben. Dies stammt aus der oben aufgeführten Quelle .
spen.smith
Guter Punkt, dies ist wahr von Pandas .22, die nach der ursprünglichen Antwort war ... Aktualisierte meine Antwort ...
ntg
69

Übergeben Sie die Elemente des Wörterbuchs an den DataFrame-Konstruktor und geben Sie die Spaltennamen an. Danach analysieren Sie die DateSpalte, um TimestampWerte zu erhalten .

Beachten Sie den Unterschied zwischen Python 2.x und 3.x:

In Python 2.x:

df = pd.DataFrame(data.items(), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])

In Python 3.x: (erfordert eine zusätzliche 'Liste')

df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])
Viktor Kerkez
quelle
3
Dies gibt mir:PandasError: DataFrame constructor not properly called!
Chris Nielsen
18
@ ChrisNielsen Sie verwenden wahrscheinlich Python3. Sie sollten versuchen:df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
Viktor Kerkez
Dies ist die bessere Antwort, da sie zeigt, was in Python 3 zu tun ist.
ifly6
10

Pandas haben eine eingebaute Funktion zur Konvertierung von Diktat in Datenrahmen.

pd.DataFrame.from_dict (dictionaryObject, orient = 'index')

Für Ihre Daten können Sie diese wie folgt konvertieren:

import pandas as pd
your_dict={u'2012-06-08': 388,
 u'2012-06-09': 388,
 u'2012-06-10': 388,
 u'2012-06-11': 389,
 u'2012-06-12': 389,
 u'2012-06-13': 389,
 u'2012-06-14': 389,
 u'2012-06-15': 389,
 u'2012-06-16': 389,
 u'2012-06-17': 389,
 u'2012-06-18': 390,
 u'2012-06-19': 390,
 u'2012-06-20': 390,
 u'2012-06-21': 390,
 u'2012-06-22': 390,
 u'2012-06-23': 390,
 u'2012-06-24': 390,
 u'2012-06-25': 391,
 u'2012-06-26': 391,
 u'2012-06-27': 391,
 u'2012-06-28': 391,
 u'2012-06-29': 391,
 u'2012-06-30': 391,
 u'2012-07-01': 391,
 u'2012-07-02': 392,
 u'2012-07-03': 392,
 u'2012-07-04': 392,
 u'2012-07-05': 392,
 u'2012-07-06': 392}

your_df_from_dict=pd.DataFrame.from_dict(your_dict,orient='index')
print(your_df_from_dict)
Suat Atan PhD
quelle
2
Das ist wirklich eine schlechte Lösung, da Wörterbuchschlüssel als Index gespeichert werden.
Ein Ökonom
6
pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })
Nader Hisham
quelle
5

Sie können die Schlüssel und Werte des Wörterbuchs auch einfach wie folgt an den neuen Datenrahmen übergeben:

import pandas as pd

myDict = {<the_dict_from_your_example>]
df = pd.DataFrame()
df['Date'] = myDict.keys()
df['DateValue'] = myDict.values()
Blairg23
quelle
5

In meinem Fall wollte ich, dass Schlüssel und Werte eines Diktats Spalten und Werte von DataFrame sind. Das einzige, was für mich funktioniert hat, war:

data = {'adjust_power': 'y', 'af_policy_r_submix_prio_adjust': '[null]', 'af_rf_info': '[null]', 'bat_ac': '3500', 'bat_capacity': '75'} 

columns = list(data.keys())
values = list(data.values())
arr_len = len(values)

pd.DataFrame(np.array(values, dtype=object).reshape(1, arr_len), columns=columns)
Artem Zaika
quelle
5

Dies hat bei mir funktioniert, da ich eine separate Indexspalte haben wollte

df = pd.DataFrame.from_dict(some_dict, orient="index").reset_index()
df.columns = ['A', 'B']
John Doe
quelle
3

Akzeptiert ein Diktat als Argument und gibt einen Datenrahmen mit den Schlüsseln des Diktats als Index und den Werten als Spalte zurück.

def dict_to_df(d):
    df=pd.DataFrame(d.items())
    df.set_index(0, inplace=True)
    return df
zuerst
quelle
Nehmen Sie ein Diktat und geben Sie einen Datenrahmen zurück
erstens
3

So hat es bei mir funktioniert:

df= pd.DataFrame([d.keys(), d.values()]).T
df.columns= ['keys', 'values']  # call them whatever you like

ich hoffe das hilft

Soufiane Chami
quelle
1
d = {'Date': list(yourDict.keys()),'Date_Values': list(yourDict.values())}
df = pandas.DataFrame(data=d)

Wenn Sie nicht einkapseln yourDict.keys()innerhalb von list(), dann werden Sie mit allen Ihren Schlüssel am Ende und Werte in jeder Zeile jeder Spalte platziert. So was:

Date \ 0 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
1 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
2 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
3 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...
4 (2012-06-08, 2012-06-09, 2012-06-10, 2012-06-1...

Aber durch Hinzufügen list()sieht das Ergebnis folgendermaßen aus:

Date Date_Values 0 2012-06-08 388 1 2012-06-09 388 2 2012-06-10 388 3 2012-06-11 389 4 2012-06-12 389 ...

NL23codes
quelle
0

Ich bin mehrmals darauf gestoßen und habe ein Beispielwörterbuch, das ich aus einer Funktion erstellt habe get_max_Path(), und es gibt das Beispielwörterbuch zurück:

{2: 0.3097502930247044, 3: 0.4413177909384636, 4: 0.5197224051562838, 5: 0.5717654946470984, 6: 0.6063959031223476, 7: 0.6365209824708223, 8: 0.655918861281035, 9: 0.680844386645206}

Um dies in einen Datenrahmen zu konvertieren, habe ich Folgendes ausgeführt:

df = pd.DataFrame.from_dict(get_max_path(2), orient = 'index').reset_index()

Gibt einen einfachen zweispaltigen Datenrahmen mit einem separaten Index zurück:

index 0 0 2 0.309750 1 3 0.441318

Benennen Sie die Spalten einfach mit um f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)

Bryan Butler
quelle
0

Ich denke, dass Sie beim Erstellen eines Wörterbuchs einige Änderungen an Ihrem Datenformat vornehmen und es dann einfach in DataFrame konvertieren können:

Eingang:

a={'Dates':['2012-06-08','2012-06-10'],'Date_value':[388,389]}

Ausgabe:

{'Date_value': [388, 389], 'Dates': ['2012-06-08', '2012-06-10']}

Eingang:

aframe=DataFrame(a)

Ausgabe: wird Ihr DataFrame sein

Sie müssen nur Text in Sublime oder vielleicht Excel bearbeiten.

Arman Nemat Pasand
quelle