how - python dictionary get key
Convierte Python dict en un marco de datos (11)
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 Unicode y los valores son enteros. Me gustaría convertir esto en un marco de datos de pandas teniendo las fechas y sus valores correspondientes como 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 pandas para ayudarme con esto.
Sé que una solución podría ser convertir cada par clave-valor en este dict, en un dict para que toda la estructura se convierta en un dicto de dicts, y luego podemos agregar cada fila individualmente al marco de datos. Pero quiero saber si hay una manera más fácil y una forma más directa de hacerlo.
Hasta ahora he tratado de convertir el dict en un objeto en serie, pero esto no parece mantener la relación entre las columnas:
s = Series(my_dict,index=my_dict.keys())
Acepta un dict como argumento y devuelve un marco de datos con las claves del dict como índice y valores como una columna.
def dict_to_df(d):
df=pd.DataFrame(d.items())
df.set_index(0, inplace=True)
return df
Al convertir un diccionario en un marco de datos de pandas en el que desea que las claves sean las columnas de dicho marco de datos y los valores sean los valores de fila, puede simplemente poner corchetes alrededor del diccionario como este:
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
Me ha salvado algunos dolores de cabeza así que espero que ayude a alguien allá afuera.
Como se explica en otra respuesta, el uso de pandas.DataFrame()
directamente aquí no actuará de la forma que usted piense.
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
Creo que puede hacer algunos cambios en su formato de datos cuando crea el diccionario, luego puede convertirlo fácilmente en 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á su DataFrame
Solo necesita usar algo de edición de texto en algún lugar como Sublime o Excel.
El error aquí es que se llama al constructor DataFrame con valores escalares (donde se espera que los valores sean una lista / dict / ... es decir, que 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
En mi caso, quería que las claves y los valores de un dict fueran columnas y valores de DataFrame. Entonces, lo único que funcionó para mí 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)
Los pandas tienen una función incorporada para la conversión de dict a marco de datos.
pd.DataFrame.from_dict (dictionaryObject, orient = ''index'')
Para sus datos puede convertirlo como a continuación:
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)
Me he encontrado con esto varias veces y tengo un diccionario de ejemplo que he creado a partir de 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 en un marco de datos, ejecuté lo siguiente:
df = pd.DataFrame.from_dict(get_max_path(2), orient = ''index'').reset_index()
Devuelve un marco de datos 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)
Pase los elementos del diccionario al constructor de DataFrame y proporcione los nombres de las columnas. Luego, analice la columna Date
para obtener los valores de Timestamp
.
Tenga en cuenta 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: (requiere una ''lista'' adicional)
df = pd.DataFrame(list(data.items()), columns=[''Date'', ''DateValue''])
df[''Date''] = pd.to_datetime(df[''Date''])
También puede pasar las claves y los valores del diccionario al nuevo marco de datos, de esta manera:
import pandas as pd
myDict = {<the_dict_from_your_example>]
df = pd.DataFrame()
df[''Date''] = myDict.keys()
df[''DateValue''] = myDict.values()
pd.DataFrame({''date'' : dict_dates.keys() , ''date_value'' : dict_dates.values() })