Convertir un DataFrame de Pandas en un diccionario

Resuelto Prince Bhatti asked hace 10 años • 12 respuestas

Tengo un DataFrame con cuatro columnas. Quiero convertir este DataFrame en un diccionario de Python. Quiero que los elementos de la primera columna sean keysy los elementos de otras columnas en la misma fila sean values.

Marco de datos:

    ID   A   B   C
0   p    1   3   2
1   q    4   3   2
2   r    4   0   9 

La salida debería ser así:

{'p': [1,3,2], 'q': [4,3,2], 'r': [4,0,9]}
Prince Bhatti avatar Nov 03 '14 21:11 Prince Bhatti
Aceptado

El to_dict()método establece los nombres de las columnas como claves de diccionario, por lo que deberá remodelar ligeramente su DataFrame. Establecer la columna 'ID' como índice y luego transponer el DataFrame es una forma de lograrlo.

to_dict()también acepta un argumento de 'orientación' que necesitará para generar una lista de valores para cada columna. {index: value}De lo contrario, se devolverá un diccionario del formulario para cada columna.

Estos pasos se pueden realizar con la siguiente línea:

>>> df.set_index('ID').T.to_dict('list')
{'p': [1, 3, 2], 'q': [4, 3, 2], 'r': [4, 0, 9]}

En caso de que se necesite un formato de diccionario diferente, aquí hay ejemplos de los posibles argumentos de orientación. Considere el siguiente marco de datos simple:

>>> df = pd.DataFrame({'a': ['red', 'yellow', 'blue'], 'b': [0.5, 0.25, 0.125]})
>>> df
        a      b
0     red  0.500
1  yellow  0.250
2    blue  0.125

Entonces las opciones son las siguientes.

dict : valor predeterminado: los nombres de las columnas son claves, los valores son diccionarios de índice: pares de datos

>>> df.to_dict('dict')
{'a': {0: 'red', 1: 'yellow', 2: 'blue'}, 
 'b': {0: 0.5, 1: 0.25, 2: 0.125}}

lista : las claves son nombres de columnas, los valores son listas de datos de columnas

>>> df.to_dict('list')
{'a': ['red', 'yellow', 'blue'], 
 'b': [0.5, 0.25, 0.125]}

serie : como 'lista', pero los valores son series

>>> df.to_dict('series')
{'a': 0       red
      1    yellow
      2      blue
      Name: a, dtype: object, 

 'b': 0    0.500
      1    0.250
      2    0.125
      Name: b, dtype: float64}

dividir : divide columnas/datos/índice como claves con valores que son nombres de columnas, valores de datos por fila y etiquetas de índice respectivamente

>>> df.to_dict('split')
{'columns': ['a', 'b'],
 'data': [['red', 0.5], ['yellow', 0.25], ['blue', 0.125]],
 'index': [0, 1, 2]}

registros : cada fila se convierte en un diccionario donde la clave es el nombre de la columna y el valor son los datos de la celda

>>> df.to_dict('records')
[{'a': 'red', 'b': 0.5}, 
 {'a': 'yellow', 'b': 0.25}, 
 {'a': 'blue', 'b': 0.125}]

índice : como 'registros', pero un diccionario de diccionarios con claves como etiquetas de índice (en lugar de una lista)

>>> df.to_dict('index')
{0: {'a': 'red', 'b': 0.5},
 1: {'a': 'yellow', 'b': 0.25},
 2: {'a': 'blue', 'b': 0.125}}
Alex Riley avatar Nov 03 '2014 14:11 Alex Riley

¿Debería un diccionario como:

{'red': '0.500', 'yellow': '0.250', 'blue': '0.125'}

ser requerido fuera de un marco de datos como:

        a      b
0     red  0.500
1  yellow  0.250
2    blue  0.125

La forma más sencilla sería hacer:

dict(df.values)

fragmento de trabajo a continuación:

import pandas as pd
df = pd.DataFrame({'a': ['red', 'yellow', 'blue'], 'b': [0.5, 0.25, 0.125]})
dict(df.values)
Muhammad Moiz Ahmed avatar May 05 '2020 13:05 Muhammad Moiz Ahmed

Sigue estos pasos:

Supongamos que su marco de datos es el siguiente:

>>> df
   A  B  C ID
0  1  3  2  p
1  4  3  2  q
2  4  0  9  r

1. Úselo set_indexpara establecer IDcolumnas como índice del marco de datos.

    df.set_index("ID", drop=True, inplace=True)

2. Utilice el orient=indexparámetro para tener el índice como claves de diccionario.

    dictionary = df.to_dict(orient="index")

Los resultados serán los siguientes:

    >>> dictionary
    {'q': {'A': 4, 'B': 3, 'D': 2}, 'p': {'A': 1, 'B': 3, 'D': 2}, 'r': {'A': 4, 'B': 0, 'D': 9}}

3. Si necesita tener cada muestra como una lista, ejecute el siguiente código. Determinar el orden de las columnas.

column_order= ["A", "B", "C"] #  Determine your preferred order of columns
d = {} #  Initialize the new dictionary as an empty dictionary
for k in dictionary:
    d[k] = [dictionary[k][column_name] for column_name in column_order]
Farhad Maleki avatar Jun 26 '2016 21:06 Farhad Maleki