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 Datumsangaben und die Werte sind Ganzzahlen. Ich möchte dies in einen Pandas-Datenrahmen umwandeln, indem die Datumsangaben und die entsprechenden Werte als zwei separate Spalten dargestellt werden. Beispiel: col1: Dates col2: DateValue (die Datumsangaben sind immer noch Unicode und Datumswerte sind 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 dieser Richtung wäre sehr dankbar. Ich kann keine Ressourcen in den Pandas-Dokumenten finden, um mir dabei zu helfen.
Ich weiß, dass eine Lösung darin bestehen kann, jedes Schlüsselwertpaar in diesem Diktat in ein Diktat umzuwandeln, sodass die gesamte Struktur zu einem Diktat von Diktaten wird. Dann können wir jede Zeile einzeln zum Datenrahmen hinzufügen. Ich möchte aber wissen, ob es einen einfacheren und direkteren Weg gibt.
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())
Der Fehler hier liegt seit dem Aufruf des DataFrame-Konstruktors mit skalaren Werten (wobei erwartet wird, dass die Werte eine Liste/dict/... sind, d. H. Mehrere Spalten enthalten):
pd.DataFrame(d)
ValueError: If using all scalar values, you must must pass an index
Sie könnten die Elemente aus dem Wörterbuch (d. H. 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 Series-Konstruktor zu übergeben:
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
Wie bereits in einer anderen Antwort erläutert, wird die Verwendung von pandas.DataFrame()
direkt hier nicht so funktionieren, wie Sie denken.
Sie können pandas.DataFrame.from_dict
mit orient='index'
verwenden:
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-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}, orient='index')
Out[7]:
0
2012-06-13 389
2012-06-16 389
2012-06-12 389
2012-07-03 392
2012-07-02 392
2012-06-29 391
2012-06-30 391
2012-07-01 391
2012-06-15 389
2012-06-08 388
2012-06-09 388
2012-07-05 392
2012-07-04 392
2012-06-14 389
2012-07-06 392
2012-06-17 389
2012-06-20 390
2012-06-21 390
2012-06-22 390
2012-06-23 390
2012-06-11 389
2012-06-10 388
2012-06-26 391
2012-06-27 391
2012-06-28 391
2012-06-24 390
2012-06-19 390
2012-06-18 390
2012-06-25 391
Übergeben Sie die Elemente des Wörterbuchs an den DataFrame-Konstruktor und geben Sie die Spaltennamen an. Danach analysieren Sie die Spalte Date
, um Timestamp
-Werte abzurufen.
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'])
Wenn Sie ein Wörterbuch in einen Pandas-Datenrahmen konvertieren, in dem die Schlüssel die Spalten des Datenrahmens und die Werte die Zeilenwerte sein sollen, können Sie das Wörterbuch einfach mit Klammern wie folgt versehen:
new_dict = {'key 1': 1, 'key 2': 2, 'key 3': 3}
In[33]:pd.DataFrame([new_dict])
Out[33]:
key 1 key 2 key 3
0 1 2 3
Es hat mir einige Kopfschmerzen erspart, also hoffe ich, dass es jemandem da draußen hilft!
Pandas haben eingebaute Funktion zur Umwandlung von Diktieren 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)
In meinem Fall wollte ich, dass Schlüssel und Werte eines Diktors Spalten und Werte von DataFrame sind. Das einzige, was für mich funktionierte, 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)
pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })
Sie können die Schlüssel und Werte des Wörterbuchs auch einfach an den neuen Datenrahmen übergeben, z.
import pandas as pd
myDict = {<the_dict_from_your_example>]
df = pd.DataFrame()
df['Date'] = myDict.keys()
df['DateValue'] = myDict.values()
Akzeptiert ein Diktat als Argument und gibt ein Datenframe mit den Schlüsseln des Diktiers als Index und Werte als Spalte zurück.
def dict_to_df(d):
df=pd.DataFrame(d.items())
df.set_index(0, inplace=True)
return df
p.s. Insbesondere fand ich zeilenorientierte Beispiele hilfreich. da werden oft so aufzeichnungen extern gespeichert.
Ich denke, dass Sie einige Änderungen an Ihrem Datenformat vornehmen können, wenn Sie ein Wörterbuch erstellen. Dann können Sie es leicht in DataFrame konvertieren:
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 etwas Textbearbeitung in Sublime oder vielleicht Excel verwenden.
d = {'Date': list(yourDict.keys()),'Date_Values': list(yourDict.values())}
df = pandas.DataFrame(data=d)
Wenn Sie yourDict.keys()
nicht in list()
kapseln, werden am Ende alle Ihre Schlüssel und Werte in jede Zeile jeder Spalte eingefügt. 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...
Durch das Hinzufügen von list()
sieht das Ergebnis dann so 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
...
Ich bin mehrmals darauf gestoßen und habe ein Beispielwörterbuch, das ich aus einer Funktion get_max_Path()
erstellt habe, 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 f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)
um.
So hat es für mich funktioniert:
df= pd.DataFrame([d.keys(), d.values()]).T
df.columns= ['keys', 'values'] # call them whatever you like
Ich hoffe das hilft