Dask cómo abrir json con lista de dicts
Estoy tratando de abrir un montón de archivos JSON usando read_json
Para obtener un Dataframe como sigue
ddf.compute()
id owner pet_id
0 1 "Charlie" "pet_1"
1 2 "Charlie" "pet_2"
3 4 "Buddy" "pet_3"
pero estoy recibiendo el siguiente error
_meta = pd.DataFrame(
columns=list(["id", "owner", "pet_id"]])
).astype({
"id":int,
"owner":"object",
"pet_id": "object"
})
ddf = dd.read_json(f"mypets/*.json", meta=_meta)
ddf.compute()
*** ValueError: Metadata mismatch found in `from_delayed`.
Mis archivos JSON parecen
[
{
"id": 1,
"owner": "Charlie",
"pet_id": "pet_1"
},
{
"id": 2,
"owner": "Charlie",
"pet_id": "pet_2"
}
]
Por lo que entiendo el problema es que estoy pasando una lista de dicts, así que estoy buscando la manera correcta de especificarlo meta=
argumentación
PD:
También intenté hacerlo de la siguiente manera
{
"id": [1, 2],
"owner": ["Charlie", "Charlie"],
"pet_id": ["pet_1", "pet_2"]
}
Pero Dask interpreta erróneamente los datos
ddf.compute()
id owner pet_id
0 [1, 2] ["Charlie", "Charlie"] ["pet_1", "pet_2"]
1 [4] ["Buddy"] ["pet_3"]
Pregunta hecha hace 3 años, 4 meses, 27 días - Por debugdragon
3 Respuestas:
-
La invocación que desea es la siguiente:
dd.read_json("data.json", meta=meta, blocksize=None, orient="records", lines=False)
que se puede recoger en gran parte de la cadena.
- meta se ve bien desde tu código
- blockize debe ser Ninguno, ya que tiene un objeto JSON entero por archivo y no puede dividir el archivo
- orient "records" significa lista de objetos
- líneas=False significa que esto es no un archivo JSON delimitado por línea, que es el caso más común para Dask (no estás suponiendo que un personaje de nueva línea significa un nuevo registro)
¿Entonces por qué el error? Probablemente Dask dividió su archivo en algún personaje de nueva línea, y así un registro parcial se paró, que por lo tanto no coincidió con su meta dada.
Respondida el Dec 18, 2020 a las 10:54 - por markupmaestro
Votos positivos: 0 | Votos negativos: 0 -
El error que estás recibiendo se debe a que estás pasando una lista de diccionarios como datos de ejemplo (
meta
) en lugar de un solo diccionario que represente la estructura de los datos que esperas en tus archivos JSON.Para solucionar este problema, puedes definir un diccionario que refleje la estructura de tus datos y pasarlo como argumento
meta
al momento de leer los archivos JSON. Aquí te muestro cómo puedes hacerlo:python import pandas as pd import dask.dataframe as dd
Definir la estructura de los datos esperados en el JSON
meta = { "id": int, "owner": str, "pet_id": str }Leer los archivos JSON con la estructura definida en 'meta'
ddf = dd.read_json("mypets/*.json", meta=meta) df = ddf.compute() print(df)Al definir
meta
como un diccionario simple con los nombres de las columnas y los tipos de datos, Dask será capaz de interpretar correctamente la estructura de los datos en los archivos JSON y crear el DataFrame adecuado.Espero que esta solución te ayude a leer tus archivos JSON con lista de diccionarios correctamente en Dask. Si tienes alguna otra pregunta, ¡no dudes en hacerla!
Respondida el Dec 19, 2020 a las 10:54 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error que estás recibiendo es causado por un desajuste entre los metadatos proporcionados y los datos reales de tus archivos JSON. Específicamente, Dask espera que los datos sean un único objeto JSON con una lista de diccionarios, pero tus archivos JSON contienen listas de diccionarios.
Para resolver este problema, puedes utilizar la función
dd.from_pandas
para crear un DataFrame distribuido a partir de una lista de diccionarios. Aquí tienes un ejemplo modificado de tu código:python import dask.dataframe as dd import pandas as pd
Crea una lista de diccionarios a partir de tus archivos JSON
dict_list = [] for filename in ["mypets/*.json"]: with open(filename) as f: data = json.load(f) dict_list.extend(data)Crea un DataFrame de Pandas a partir de la lista de diccionarios
df = pd.DataFrame(dict_list)Crea un DataFrame distribuido a partir del DataFrame de Pandas
ddf = dd.from_pandas(df, npartitions=2)Calcula el resultado
result = ddf.compute() print(result)Este código creará un DataFrame distribuido a partir de la lista de diccionarios y lo calculará para obtener el resultado.
Respondida el Dec 19, 2020 a las 10:58 - por Gemini
Votos positivos: 0 | Votos negativos: 0