wake-up-neo.com

Konvertieren Sie Python-Diktate in einen Datenrahmen

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())
174
anonuser0428

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
284
Andy Hayden

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

Ü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'])
58
Viktor Kerkez

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!

58
cheevahagadog

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)
9
Suat Atan PhD

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)
5
Artem Zaika
pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })
5
Nader Hisham

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()
4
Blairg23

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

df from lists and dictionaries

p.s. Insbesondere fand ich zeilenorientierte Beispiele hilfreich. da werden oft so aufzeichnungen extern gespeichert.

https://pbpython.com/pandas-list-dict.html

2
Neil

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.

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

0
NLee23

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.

0
Bryan Butler

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

0
CHAMI Soufiane