Saltar al contenido

Convierta la lista de diccionarios en un DataFrame de pandas

Buscamos por el mundo on line para de esta manera traerte la respuesta para tu dilema, si tienes alguna pregunta déjanos tu inquietud y contestamos con gusto.

Solución:

Suponiendo que d es su lista de dictados, simplemente:

df = pd.DataFrame(d)

Nota: esto no funciona con datos anidados.

¿Cómo convierto una lista de diccionarios en un DataFrame de pandas?

Las otras respuestas son correctas, pero no se ha explicado mucho en términos de ventajas y limitaciones de estos métodos. El objetivo de esta publicación será mostrar ejemplos de estos métodos en diferentes situaciones, discutir cuándo usarlos (y cuándo no usarlos) y sugerir alternativas.


DataFrame(), DataFrame.from_records()y .from_dict()

Según la estructura y el formato de sus datos, hay situaciones en las que funcionan los tres métodos, o algunos funcionan mejor que otros, o algunos no funcionan en absoluto.

Considere un ejemplo muy artificial.

np.random.seed(0)
data = pd.DataFrame(
    np.random.choice(10, (3, 4)), columns=list('ABCD')).to_dict('r')

print(data)
['A': 5, 'B': 0, 'C': 3, 'D': 3,
 'A': 7, 'B': 9, 'C': 3, 'D': 5,
 'A': 2, 'B': 4, 'C': 7, 'D': 6]

Esta lista consta de “registros” con cada keys regalo. Este es el caso más simple que podría encontrar.

# The following methods all produce the same output.
pd.DataFrame(data)
pd.DataFrame.from_dict(data)
pd.DataFrame.from_records(data)

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6

Palabra en Orientaciones del Diccionario: orient='index'/'columns'

Antes de continuar, es importante hacer la distinción entre los diferentes tipos de orientaciones del diccionario y el soporte con pandas. Hay dos tipos principales: “columnas” e “índice”.

orient='columns'

Los diccionarios con la orientación “columnas” tendrán su keys corresponden a columnas en el DataFrame equivalente.

Por ejemplo, data arriba está en el oriente de “columnas”.

data_c = [
 'A': 5, 'B': 0, 'C': 3, 'D': 3,
 'A': 7, 'B': 9, 'C': 3, 'D': 5,
 'A': 2, 'B': 4, 'C': 7, 'D': 6]
pd.DataFrame.from_dict(data_c, orient='columns')

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6

Nota: Si está utilizando pd.DataFrame.from_recordsse supone que la orientación es “columnas” (no puede especificar lo contrario), y los diccionarios se cargarán en consecuencia.

orient='index'

Con este oriente, keys se supone que corresponden a los valores del índice. Este tipo de datos es más adecuado para pd.DataFrame.from_dict.

data_i =
 0: 'A': 5, 'B': 0, 'C': 3, 'D': 3,
 1: 'A': 7, 'B': 9, 'C': 3, 'D': 5,
 2: 'A': 2, 'B': 4, 'C': 7, 'D': 6
pd.DataFrame.from_dict(data_i, orient='index')

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6

Este caso no se considera en el OP, pero aún es útil saberlo.

Configuración del índice personalizado

Si necesita un índice personalizado en el DataFrame resultante, puede configurarlo usando el index=... argumento.

pd.DataFrame(data, index=['a', 'b', 'c'])
# pd.DataFrame.from_records(data, index=['a', 'b', 'c'])

   A  B  C  D
a  5  0  3  3
b  7  9  3  5
c  2  4  7  6

Esto no está respaldado por pd.DataFrame.from_dict.

Manejo de claves/columnas faltantes

Todos los métodos funcionan de manera inmediata cuando se manejan diccionarios que faltan. keys/valores de columna. Por ejemplo,

data2 = [
     'A': 5, 'C': 3, 'D': 3,
     'A': 7, 'B': 9, 'F': 5,
     'B': 4, 'C': 7, 'E': 6]
# The methods below all produce the same output.
pd.DataFrame(data2)
pd.DataFrame.from_dict(data2)
pd.DataFrame.from_records(data2)

     A    B    C    D    E    F
0  5.0  NaN  3.0  3.0  NaN  NaN
1  7.0  9.0  NaN  NaN  NaN  5.0
2  NaN  4.0  7.0  NaN  6.0  NaN

Subconjunto de lectura de columnas

“¿Qué pasa si no quiero leer en cada columna”? Puede especificar esto fácilmente usando el columns=... parámetro.

Por ejemplo, del diccionario de ejemplos de data2 arriba, si desea leer solo las columnas “A”, “D” y “F”, puede hacerlo pasando una lista:

pd.DataFrame(data2, columns=['A', 'D', 'F'])
# pd.DataFrame.from_records(data2, columns=['A', 'D', 'F'])

     A    D    F
0  5.0  3.0  NaN
1  7.0  NaN  5.0
2  NaN  NaN  NaN

Esto no está respaldado por pd.DataFrame.from_dict con las “columnas” de orientación predeterminadas.

pd.DataFrame.from_dict(data2, orient='columns', columns=['A', 'B'])
ValueError: cannot use columns parameter with orient='columns'

Leer subconjunto de filas

No compatible con ninguno de estos métodos directamente. Tendrá que iterar sobre sus datos y realizar una eliminación inversa en el lugar mientras itera. Por ejemplo, para extraer solo el 0el y 2Dakota del Norte filas de data2 arriba, puedes usar:

rows_to_select = 0, 2
for i in reversed(range(len(data2))):
    if i not in rows_to_select:
        del data2[i]

pd.DataFrame(data2)
# pd.DataFrame.from_dict(data2)
# pd.DataFrame.from_records(data2)

     A    B  C    D    E
0  5.0  NaN  3  3.0  NaN
1  NaN  4.0  7  NaN  6.0

La panacea: json_normalize para datos anidados

Una alternativa fuerte y robusta a los métodos descritos anteriormente es el json_normalize función que trabaja con listas de diccionarios (registros), y además también puede manejar diccionarios anidados.

pd.json_normalize(data)

   A  B  C  D
0  5  0  3  3
1  7  9  3  5
2  2  4  7  6
pd.json_normalize(data2)

     A    B  C    D    E
0  5.0  NaN  3  3.0  NaN
1  NaN  4.0  7  NaN  6.0

Una vez más, tenga en cuenta que los datos pasados ​​a json_normalize debe estar en formato de lista de diccionarios (registros).

Como se mencionó, json_normalize también puede manejar diccionarios anidados. Aquí hay un ejemplo tomado de la documentación.

data_nested = [
  'counties': ['name': 'Dade', 'population': 12345,
                'name': 'Broward', 'population': 40000,
                'name': 'Palm Beach', 'population': 60000],
   'info': 'governor': 'Rick Scott',
   'shortname': 'FL',
   'state': 'Florida',
  'counties': ['name': 'Summit', 'population': 1234,
                'name': 'Cuyahoga', 'population': 1337],
   'info': 'governor': 'John Kasich',
   'shortname': 'OH',
   'state': 'Ohio'
]
pd.json_normalize(data_nested, 
                          record_path='counties', 
                          meta=['state', 'shortname', ['info', 'governor']])

         name  population    state shortname info.governor
0        Dade       12345  Florida        FL    Rick Scott
1     Broward       40000  Florida        FL    Rick Scott
2  Palm Beach       60000  Florida        FL    Rick Scott
3      Summit        1234     Ohio        OH   John Kasich
4    Cuyahoga        1337     Ohio        OH   John Kasich

Para obtener más información sobre el meta y record_path argumentos, echa un vistazo a la documentación.


resumiendo

Aquí hay una tabla de todos los métodos discutidos anteriormente, junto con las características/funcionalidad compatibles.

ingrese la descripción de la imagen aquí

* Utilizar orient='columns' y luego transponer para obtener el mismo efecto que orient='index'.

En pandas 16.2, tuve que hacer pd.DataFrame.from_records(d) para que esto funcione.

Si te gusta el asunto, tienes el poder dejar un escrito acerca de qué le añadirías a esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *