Convierta el dictado de Python en un marco de datos

7 minutos de lectura

Convierta el dictado de Python en un marco de datos
anonuser0428

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 llaves son Unicode las fechas 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 dictado, en un dictado para que toda la estructura se convierta en un dictado de dictados, y luego podamos agregar cada fila individualmente al marco de datos. Pero quiero saber si hay una manera más fácil y directa de hacer esto.

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

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

  • Intenté convertir el dict en un objeto de serie con las fechas como índice, pero eso no coincidió con las fechas con los valores correspondientes por alguna razón.

    – anonuser0428

    16/09/2013 a las 21:04

  • el código ha sido publicado. Quiero preguntar si hay una forma de crear un marco de datos sin crear un dictado de dictados y luego agregar cada fila por separado.

    – anonuser0428

    16/09/2013 a las 21:08

  • ¿Qué es una “fecha Unicode”? ¿Quieres decir un ISO 8601 ¿fecha?

    -Peter Mortensen

    16 de noviembre de 2015 a las 21:04


Convierta el dictado de Python en un marco de datos
Andy Hayden

El error aquí se debe a que llama al constructor de DataFrame con valores escalares (donde espera que los valores sean una lista/dictado/… es decir, que tenga 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 Series:

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

  • @ user1009091 Me di cuenta de lo que significa el error ahora, básicamente dice “Lo que estoy viendo es una serie, así que use el constructor de series”.

    –Andy Hayden

    16/09/2013 a las 21:16


  • Gracias, muy útil. ¿Podría quizás explicar cuál es la diferencia entre usar este método y usar DataFrame.from_dict() ? Su método (que usé) devuelve type = pandas.core.frame.DataFrame, mientras que el otro devuelve type = class ‘pandas.core.frame.DataFrame’. ¿Alguna posibilidad de que pueda explicar la diferencia y cuándo es apropiado cada método? Gracias por adelantado 🙂

    – Óptimo

    04/01/2015 a las 10:01

  • estoy viendo pandas.core.common.PandasError: DataFrame constructor not properly called! del primer ejemplo

    – todas las señales

    29 de marzo de 2016 a las 17:44


  • @allthesignals agregar list() alrededor de d.items funciona: pd.DataFrame(list(d.items()), column=[‘Date’, ‘DateValue’])

    – sigurdb

    22 de febrero de 2018 a las 19:48

  • @AndyHayden, ¿por qué defendió la serie sobre la solución del artículo? ¿Es porque el OP tenía miles de entradas? La primera opción funcionó para mí, así que se dieron las gracias.

    – Vaidotas I.

    11/08/2019 a las 19:00

1646759049 50 Convierta el dictado de Python en un marco de datos
cheevahagado

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 de esta manera:

>>> dict_ = {'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3'}
>>> pd.DataFrame([dict_])

    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!

EDITAR: En los pandas documentos una opción para el data El parámetro en el constructor de DataFrame es una lista de diccionarios. Aquí estamos pasando una lista con un diccionario en ella.

  • Sí, también hice esto pero agregué .T para transponer.

    – Anton vBR

    14/02/2018 a las 20:50

  • Funciona bien, pero no sé por qué tenemos que hacerlo así.

    – hui-chen

    12 de junio de 2019 a las 13:21

  • ¿Qué pasa si quiero que una de estas columnas se use como índice?

    – om tripathi

    18 de septiembre de 2019 a las 11:08

1646759049 57 Convierta el dictado de Python en un marco de datos
ntg

Como se explica en otra respuesta usando pandas.DataFrame() directamente aquí no actuará como usted piensa.

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-07-05': 392,
 u'2012-07-06': 392}, orient="index", columns=['foo'])
Out[7]: 
            foo
2012-06-08  388
2012-06-09  388
2012-06-10  388
2012-06-11  389
2012-06-12  389
........
2012-07-05  392
2012-07-06  392

  • podemos encadenar esto con cualquier rename método para establecer también los nombres del índice y columnas de una vez?

    – Ciprian Tomoiaga

    29 de enero de 2017 a las 16:28


  • buen punto. Un ejemplo sería: …., orient=’index’).rename(columns={0:’foobar’})

    – NTG

    21 de febrero de 2017 a las 15:59


  • También puede especificar pandas.DataFrame.from_dict(…, orientar = ‘índice’, columnas = [‘foo’, ‘bar’]), esto es de la fuente mencionada anteriormente.

    – spen.smith

    13 de noviembre de 2019 a las 17:51


  • buen punto, esto es cierto de pandas .22 que fue después de la respuesta original … Actualicé mi respuesta …

    – NTG

    14 de noviembre de 2019 a las 7:18

1646759050 839 Convierta el dictado de Python en un marco de datos
Víctor Kerkez

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

Tenga en cuenta la diferencia entre python 2.x y 3.x:

En pitón 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'])

df de listas y diccionarios

ps en particular, he encontrado útiles los ejemplos orientados a filas; ya que a menudo es así como los registros se almacenan externamente.

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

1646759051 347 Convierta el dictado de Python en un marco de datos
Doctorado en Suat Atan

Los pandas tienen función incorporada para la conversión de dict a marco de datos.

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

Para sus datos, puede convertirlos como se muestra 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)

1646759051 237 Convierta el dictado de Python en un marco de datos
Abhishek S

Esto es lo que funcionó para mí, ya que quería tener una columna de índice separada

df = pd.DataFrame.from_dict(some_dict, orient="index").reset_index()
df.columns = ['A', 'B']

  • Este índice fijo fue corregido para mí

    – usuario1564762

    13 de enero a las 16:26

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad