Convertir el dictado de Python en un dataframe

Tengo un diccionario de Python como el siguiente:

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

Las claves son fechas de Unicode y los valores son enteros. Me gustaría convertir esto en un dataframe de pandas teniendo las fechas y sus valores correspondientes en dos columnas separadas. Ejemplo: col1: Fechas col2: DateValue (las fechas siguen siendo Unicode y los valores de fecha siguen siendo enteros)

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

Cualquier ayuda en esta dirección sería muy apreciada. No puedo encontrar recursos en los documentos de los pandas para ayudarme con esto.

Sé que una solución podría ser convertir cada par clave-valor en este dictado, en un dictado para que toda la estructura se convierta en dictado de dictados, y luego podamos agregar cada fila individualmente al dataframe. Pero quiero saber si hay una forma más fácil y más directa de hacerlo.

Hasta ahora he intentado convertir el dictado en un objeto de serie, pero esto no parece mantener la relación entre las columnas:

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

El error aquí se debe a que se llama al constructor DataFrame con valores escalares (donde se espera que los valores sean una lista / dict / … es decir, tengan varias columnas):

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

Puede tomar los elementos del diccionario (es decir, los pares clave-valor):

 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 

Pero creo que tiene más sentido pasar el constructor de la serie:

 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 

Como se explica en otra respuesta, el uso de pandas.DataFrame() directamente aquí no actuará como usted cree.

Lo que puedes hacer es usar pandas.DataFrame.from_dict con 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 

Pase los elementos del diccionario al constructor DataFrame y dé los nombres de las columnas. Después de eso, analice la columna Date para obtener los valores de la Timestamp .

Note la diferencia entre python 2.xy 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: (que requiere una ‘lista’ adicional)

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

Al convertir un diccionario en un dataframe de pandas en el que desea que las claves sean las columnas de dicho dataframe y que los valores sean los valores de las filas, puede colocar corchetes alrededor del diccionario de la siguiente manera:

 new_dict = {'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3'} In[33]:pd.DataFrame([new_dict]) Out[33]: key 1 key 2 key 3 0 value 1 value 2 value 3 

¡Me ha ahorrado algunos dolores de cabeza, así que espero que ayude a alguien por ahí!

Las pandas tienen una función incorporada para la conversión de dict a ttwig de datos.

pd.DataFrame.from_dict (dictionaryObject, orient = ‘index’)

Para tus datos puedes convertirlos como abajo:

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

En mi caso, quería que las claves y los valores de un dict fueran columnas y valores de DataFrame. Así que lo único que me funcionó fue:

 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) 

También puede pasar las claves y los valores del diccionario al nuevo dataframe, así:

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

Acepta un dict como argumento y devuelve un dataframe con las claves del dict como índice y los valores como columna.

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

Así es como funcionó para mí:

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

espero que esto ayude

Me he encontrado con esto varias veces y tengo un diccionario de ejemplo que creé desde una función get_max_Path() , y devuelve el diccionario de muestra:

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

Para convertir esto a un dataframe, ejecuté lo siguiente:

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

Devuelve un dataframe simple de dos columnas con un índice separado:

index 0 0 2 0.309750 1 3 0.441318

Simplemente cambie el nombre de las columnas usando f.rename(columns={'index': 'Column1', 0: 'Column2'}, inplace=True)

Creo que puedes hacer algunos cambios en tu formato de datos cuando crees un diccionario, entonces puedes convertirlo fácilmente a DataFrame:

entrada:

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

salida:

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

entrada:

 aframe=DataFrame(a) 

salida: será tu DataFrame

Solo necesitas usar alguna edición de texto en algún lugar como Sublime o tal vez Excel.

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

Si no encapsula yourDict.keys() dentro de list() , entonces terminará con todas sus claves y valores colocados en cada fila de cada columna. Me gusta esto:

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

Pero al agregar list() el resultado se ve así:

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