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 al tener 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 dict de dicts, y luego podamos agregar cada fila individualmente al marco de datos. Pero quiero saber si hay una manera más fácil y más directa de hacerlo.
Hasta ahora he intentado 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())
Respuestas:
El error aquí, es desde llamar al constructor DataFrame con valores escalares (donde espera que los valores sean una lista / dict / ... es decir, que tengan varias columnas):
Puede tomar los elementos del diccionario (es decir, los pares clave-valor):
Pero creo que tiene más sentido pasar el constructor de la serie:
fuente
from_dict
tienen un kwarg orientado, por lo que podría usarlo si quisiera evitar la transposición. Hay pocas opciones confrom_dict
, debajo del capó no es realmente diferente de usar el constructor DataFrame.pandas.core.common.PandasError: DataFrame constructor not properly called!
desde el primer ejemploAl convertir un diccionario en un marco de datos de pandas donde 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 de esta manera:
¡Me ha ahorrado algunos dolores de cabeza, así que espero que ayude a alguien!
EDITAR: en los documentos de pandas, una opción para el
data
parámetro en el constructor DataFrame es una lista de diccionarios. Aquí estamos pasando una lista con un diccionario en ella.fuente
Como se explica en otra respuesta, usar
pandas.DataFrame()
directamente aquí no actuará como usted piensa.Lo que puedes hacer es usar
pandas.DataFrame.from_dict
conorient='index'
:fuente
rename
método para establecer también los nombres del índice y las columnas de una vez?Pase los elementos del diccionario al constructor DataFrame y proporcione los nombres de las columnas. Después de eso, analice la
Date
columna para obtenerTimestamp
valores.Tenga en cuenta la diferencia entre python 2.xy 3.x:
En python 2.x:
En Python 3.x: (requiere una 'lista' adicional)
fuente
PandasError: DataFrame constructor not properly called!
df = pd.DataFrame(list(data.items()), columns=['Date', 'DateValue'])
ps en particular, he encontrado útiles los ejemplos orientados a filas; ya que a menudo así se almacenan los registros externamente.
https://pbpython.com/pandas-list-dict.html
fuente
Los pandas tienen una función incorporada para la conversión de dict a marco de datos.
Para sus datos, puede convertirlos de la siguiente manera:
fuente
fuente
También puede pasar las claves y los valores del diccionario al nuevo marco de datos, así:
fuente
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:
fuente
Esto es lo que funcionó para mí, ya que quería tener una columna de índice separada
fuente
Acepta un dict como argumento y devuelve un marco de datos con las claves del dict como índice y los valores como una columna.
fuente
Así es como funcionó para mí:
espero que esto ayude
fuente
Si no encapsula
yourDict.keys()
dentro delist()
, 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 ...
fuente
Me he encontrado con esto varias veces y tengo un diccionario de ejemplo que creé a partir de una función
get_max_Path()
, y me 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)
fuente
Creo que puede hacer algunos cambios en su formato de datos cuando crea un diccionario, luego puede convertirlo fácilmente a DataFrame:
entrada:
salida:
entrada:
salida: será su DataFrame
Solo necesita usar algo de edición de texto en algún lugar como Sublime o tal vez Excel.
fuente