Jeg har en Python-ordbog som følgende:
{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}
Nøglerne er Unicode datoer og værdierne er hele tal. Jeg vil gerne konvertere dette til et pandas dataframe ved at have datoerne og deres tilsvarende værdier som to separate kolonner. Eksempel: col1: Datoer col2: DateValue (datoerne er stadig Unicode og datoværdierne er stadig hele tal)
Date DateValue
0 2012-07-01 391
1 2012-07-02 392
2 2012-07-03 392
. 2012-07-04 392
. ... ...
. ... ...
Enhver hjælp i denne retning vil blive meget værdsat. Jeg er ikke i stand til at finde ressourcer på pandas docs til at hjælpe mig med dette.
Jeg ved, at en løsning kunne være at konvertere hvert nøgle-værdipar i dette dict, til et dict, så hele strukturen bliver et dict af dicts, og så kan vi tilføje hver række individuelt til dataframe. Men jeg vil gerne vide, om der er en nemmere måde og en mere direkte måde at gøre dette på.
Indtil videre har jeg prøvet at konvertere dict'en til et serieobjekt, men det ser ikke ud til at bevare forholdet mellem kolonnerne:
s = Series(my_dict,index=my_dict.keys())
Fejlen her er, at du kalder DataFrame-konstruktøren med skalarværdier (hvor den forventer, at værdierne er en liste/dict/... dvs. har flere kolonner):
pd.DataFrame(d)
ValueError: If using all scalar values, you must must pass an index
Du kunne tage elementerne fra ordbogen (dvs. nøgle-værdiparrene):
In [11]: pd.DataFrame(list(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(list(d.items()), columns=['Date', 'DateValue'])
Out[12]:
Date DateValue
0 2012-07-02 392
1 2012-07-06 392
2 2012-06-29 391
Men jeg synes, det giver mere mening at overdrage Series-konstruktøren:
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
Overfør elementerne i ordbogen til DataFrame-konstruktøren, og giv kolonnenavnene. Derefter analyseres kolonnen Date
for at få Timestamp
-værdier.
Bemærk forskellen mellem python 2.x og 3.x:
I python 2.x:
df = pd.DataFrame(data.items(), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])
I Python 3.x: (kræver en ekstra 'list')
df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
df['Date'] = pd.to_datetime(df['Date'])
Accepterer et dict som argument og returnerer et dataframe med nøglerne i dict'et som indeks og værdierne som kolonne.
def dict_to_df(d):
df=pd.DataFrame(d.items())
df.set_index(0, inplace=True)
return df