Converteer Python Dict in een dataframe

Ik heb een woordenboek van Python zoals het volgende:

{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}

De toetsen zijn Unicode datums en de waarden zijn gehele getallen. Ik zou dit graag willen converteren in een Pandas-dataframe door de datums en hun bijbehorende waarden te hebben als twee afzonderlijke kolommen. Voorbeeld: COL1: DATA COL2: DATEVALUE (de data zijn nog steeds Unicode en DateValues ​​zijn nog steeds gehele getallen)

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

Elke hulp in deze richting zou zeer op prijs worden gesteld. Ik kan geen middelen vinden op de Panda’s Documenten om me hiermee te helpen.

Ik weet dat één oplossing kan zijn om elk sleutelwaardepaar in deze dict in te zetten, in een dict, zodat de hele structuur een dict van dictten wordt, en dan kunnen we elke rij afzonderlijk aan het dataframe toevoegen. Maar ik wil weten of er een eenvoudiger manier is en een meer directe manier om dit te doen.

Tot nu toe heb ik geprobeerd de dict in een serie-object te converteren, maar dit lijkt niet de relatie tussen de kolommen te handhaven:

s  = Series(my_dict,index=my_dict.keys())

Antwoord 1, Autoriteit 100%

De fout hier, is sindsdien de dataframe-constructeur belt met scalaire waarden (waarbij het verwacht dat waarden een lijst / dict / … d.w.z. hebben meerdere kolommen):

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

U kunt de artikelen uit het woordenboek (d.w.z. de paren van de sleutelwaarde):

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

Maar ik denk dat het meer logisch is om de reeksconstructeur door te geven:

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

Antwoord 2, Autoriteit 37%

Bij het converteren van een woordenboek in een PANDAS-dataframe waar u wilt dat de toetsen de kolommen van het dataframe zijn en de waarden als de rijwaarden zijn, kunt u eenvoudig haakjes rond het woordenboek vinden:

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

Het heeft me wat kopzorgen bespaard, dus ik hoop dat het iemand helpt!

EDIT: In de documenten van panda’seen optie voor de parameter datain de DataFrame-constructor is een lijst met woordenboeken. Hier passeren we een lijst met één woordenboek erin.


Antwoord 3, autoriteit 22%

Zoals uitgelegd in een ander antwoord, zal het gebruik van pandas.DataFrame()hier direct niet werken zoals u denkt.

Wat u kunt doen, is pandas.DataFrame.from_dictmet 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

Antwoord 4, autoriteit 12%

Geef de items van het woordenboek door aan de DataFrame-constructor en geef de kolomnamen. Ontleed daarna de kolom Dateom Timestamp-waarden te krijgen.

Let op het verschil tussen python 2.x en 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: (een extra ‘lijst’ vereist)

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

Antwoord 5, Autoriteit 6%

P.S. In het bijzonder heb ik rijgerichte voorbeelden nuttig gevonden; Sindsdien dat hoe records extern worden opgeslagen.

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


Antwoord 6, Autoriteit 2%

Panda’s hebben ingebouwde functie voor conversie van dict naar data-frame.

pd.dataframe.from_dict (dictionaryobject, orient = ‘index’)

Voor uw gegevens kunt u het zoals hieronder converteren:

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)

Antwoord 7

Dit is wat voor mij werkte, omdat ik een aparte indexkolom wilde hebben

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

Antwoord 8

pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })

Antwoord 9

Je kunt de sleutels en waarden van het woordenboek ook gewoon doorgeven aan het nieuwe dataframe, zoals:

import pandas as pd
myDict = {<the_dict_from_your_example>]
df = pd.DataFrame()
df['Date'] = myDict.keys()
df['DateValue'] = myDict.values()

Antwoord 10

In mijn geval wilde ik dat sleutels en waarden van een dict kolommen en waarden van DataFrame waren. Dus het enige dat voor mij werkte was:

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)

Antwoord 11

Accepteert een dictaat als argument en retourneert een dataframe met de sleutels van het dict als index en waarden als een kolom.

def dict_to_df(d):
    df=pd.DataFrame(d.items())
    df.set_index(0, inplace=True)
    return df

Antwoord 12

Dit is hoe het voor mij werkte:

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

Ik hoop dat dit

helpt


Antwoord 13

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

Als u niet inkapselt yourDict.keys()Inside of list(), dan eindigt u met al uw sleutels en waarden in elk rij van elke kolom. Zoals dit:

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

Maar door het toevoegen van list()dan ziet het resultaat er als volgt uit:

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


Antwoord 14

Ik ben hier meerdere keren ingaan en heb een voorbeeldwoordenboek dat ik heb gemaakt vanuit een functie get_max_Path(), en het retourneert het voorbeeldwoordenboek:

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

Om dit naar een dataframe te converteren, liep ik het volgende:

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

Retourneert een eenvoudig twee kolomdataframe met een aparte index:

index 0
0 2 0.309750
1 3 0.441318

Hernoem de kolommen gewoon met f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)


Antwoord 15

Ik denk dat u enkele wijzigingen in uw gegevensindeling kunt aanbrengen wanneer u woordenboek maakt, dan kunt u het eenvoudig converteren naar dataframe:

Invoer:

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

Uitgang:

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

Invoer:

aframe=DataFrame(a)

Uitgang: wordt uw dataframe

U hoeft alleen wat tekst te gebruiken die ergens als Sublime of Misschien uitblinkt.


Antwoord 16

De eenvoudigste manier die ik vond is om een ​​leeg dataframe te maken en de dict te voegen.
Je moet Panda vertellen dat Panda niet om de index geeft, anders krijg je de foutmelding: TypeError: Can only append a dict if ignore_index=True

import pandas as pd
mydict = {'foo': 'bar'}
df = pd.DataFrame()
df = df.append(mydict, ignore_index=True)

Other episodes