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())
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
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
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'])
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!
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)
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)
pd.DataFrame({'date' : dict_dates.keys() , 'date_value' : dict_dates.values() })
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()
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
p.s. en particulier, j'ai trouvé des exemples orientés ligne utiles. depuis souvent que comment les enregistrements sont stockés en externe.
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.
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
...
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