web-dev-qa-db-fra.com

Convertir un dict Python en un cadre de données

J'ai un dictionnaire Python comme celui-ci:

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

Les clés sont Unicode dates et les valeurs sont des entiers. Je voudrais convertir ceci en une base de données de pandas en ayant les dates et leurs valeurs correspondantes en deux colonnes séparées. Exemple: col1: Dates col2: DateValue (les dates sont toujours Unicode et les valeurs de date sont encore des entiers)

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

Toute aide dans cette direction serait très appréciée. Je suis incapable de trouver des ressources sur les pandas pour m'aider avec cela.

Je sais qu'une solution pourrait consister à convertir chaque paire clé-valeur de ce dictionnaire en un dictionnaire afin que l'ensemble de la structure devienne un dictionnaire de dictés, puis que nous puissions ajouter chaque ligne individuellement au cadre de données. Mais je veux savoir s’il existe un moyen plus simple et plus direct de le faire.

Jusqu'à présent, j'ai essayé de convertir le dict en un objet de série, mais cela ne semble pas maintenir la relation entre les colonnes:

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

L'erreur ici est depuis l'appel du constructeur DataFrame avec des valeurs scalaires (où il s'attend à ce que les valeurs soient une liste/dict/... c'est-à-dire plusieurs colonnes):

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

Vous pouvez prendre les éléments du dictionnaire (c'est-à-dire les paires clé-valeur):

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

Mais je pense qu'il est plus logique de passer le constructeur de la série:

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

Comme expliqué dans une autre réponse, l'utilisation de pandas.DataFrame() directement ici n'agira pas comme vous le pensez.

Ce que vous pouvez faire est d'utiliser pandas.DataFrame.from_dict avec 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-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

Transmettez les éléments du dictionnaire au constructeur DataFrame et donnez les noms des colonnes. Après cela, analysez la colonne Date pour obtenir les valeurs Timestamp.

Notez la différence entre Python 2.x et 3.x:

En python 2.x:

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

En Python 3.x: (nécessitant une "liste" supplémentaire)

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

Lors de la conversion d'un dictionnaire en une base de données pandas où vous souhaitez que les clés soient les colonnes de cette base de données et que les valeurs soient les valeurs des lignes, vous pouvez simplement placer des crochets autour du dictionnaire, comme suit:

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

Cela m'a évité des maux de tête, alors j'espère que cela aidera quelqu'un là-bas!

58
cheevahagadog

Les pandas ont une fonction intégrée pour la conversion de dict en trame de données.

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

Pour vos données, vous pouvez le convertir comme ci-dessous:

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

Dans mon cas, je voulais que les clés et les valeurs d'un dict soient des colonnes et des valeurs de DataFrame. Donc, la seule chose qui a fonctionné pour moi était:

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

Vous pouvez également simplement transmettre les clés et les valeurs du dictionnaire au nouveau cadre de données, comme suit:

import pandas as pd

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

Accepte un dict en tant qu’argument et renvoie une image de données avec les clés du dict comme index et les valeurs sous forme de colonne.

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. en particulier, j'ai trouvé des exemples orientés ligne utiles. depuis souvent que comment les enregistrements sont stockés en externe.

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

2
Neil

Je pense que vous pouvez apporter des modifications au format de vos données lorsque vous créez un dictionnaire, puis vous pouvez facilement le convertir en DataFrame:

contribution:

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

sortie:

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

contribution:

aframe=DataFrame(a)

sortie: sera votre DataFrame

Vous avez juste besoin d’utiliser un éditeur de texte quelque part comme Sublime ou peut-être Excel.

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

Si vous n'encapsulez pas yourDict.keys() dans list(), toutes vos clés et valeurs seront placées dans chaque ligne de chaque colonne. Comme ça:

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

Mais en ajoutant list(), le résultat ressemble à ceci:

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

Cela a fonctionné pour moi: 

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

J'espère que ça aide

0
CHAMI Soufiane