Importando un solo registro usando Read_Json en Pandas -- python campo con json campo con pandas camp Relacionados El problema

Importing single record using read_json in pandas


2
vote

problema

Español

Estoy tratando de importar un archivo JSON usando la función:

  sku = pandas.read_json('https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111')   

Sin embargo, sigo obteniendo el siguiente error

ValueError: Las matrices deben ser todas de la misma longitud

¿Qué debo hacer para importarlo correctamente en un contexto de datos?

Esta es la estructura del JSON:

  { "id": "5", "sku": "JOSH:BECO-BRN", "last_updated": "2013-06-10 15:46:22",  ...  "propertyType1": [     "manufacturer_colour" ], "category": [     {         "category_id": "10",         "category_name": "All Products"     },      ...      {         "category_id": "238",         "category_name": "All Sofas"     } ], "root_categories": [     "516" ], "url": "/p/Beco Suede Sofa Bed?product_id=5", "item": [     "2" ], "image_names": "["https:\/\/cdn.worldstores.co.uk\/images\/products\/L\/19\/Beco_Suede_Sofa_Bed-1.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/P\/19\/Beco_Suede_Sofa_Bed-1.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/SP\/19\/Beco_Suede_Sofa_Bed-1.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/SS\/19\/Beco_Suede_Sofa_Bed-1.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/ST\/19\/Beco_Suede_Sofa_Bed-1.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/WP\/19\/Beco_Suede_Sofa_Bed-1.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/L\/19\/Beco_Suede_Sofa_Bed-2.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/P\/19\/Beco_Suede_Sofa_Bed-2.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/SP\/19\/Beco_Suede_Sofa_Bed-2.jpg","https:\/\/cdn.worldstores.co.uk \/images\/products\/SS\/19\/Beco_Suede_Sofa_Bed-2.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/ST\/19\/Beco_Suede_Sofa_Bed-2.jpg","https:\/\/cdn.worldstores.co.uk\/images\/products\/WP\/19\/Beco_Suede_Sofa_Bed-2.jpg"]"   

}

Original en ingles

I am trying to import a json file using the function:

sku = pandas.read_json('https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111') 

However, i keep getting the following error

ValueError: arrays must all be same length

What should I do to import it correctly into a dataframe?

this is the structure of the json:

{ "id": "5", "sku": "JOSH:BECO-BRN", "last_updated": "2013-06-10 15:46:22",  ...  "propertyType1": [     "manufacturer_colour" ], "category": [     {         "category_id": "10",         "category_name": "All Products"     },      ...      {         "category_id": "238",         "category_name": "All Sofas"     } ], "root_categories": [     "516" ], "url": "/p/Beco Suede Sofa Bed?product_id=5", "item": [     "2" ], "image_names": "[\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/L\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/P\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/SP\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/SS\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/ST\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/WP\\/19\\/Beco_Suede_Sofa_Bed-1.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/L\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/P\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/SP\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk \\/images\\/products\\/SS\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/ST\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\",\"https:\\/\\/cdn.worldstores.co.uk\\/images\\/products\\/WP\\/19\\/Beco_Suede_Sofa_Bed-2.jpg\"]" 

}

        
     
     

Lista de respuestas

7
 
vote
vote
La mejor respuesta
 

El pandas.read_json Función toma múltiples formatos.

Dado que no especificó en qué formato se encuentra su archivo JSON ( 9988777661 ATTRIBUTE), PANDAS se incumplirá para creer que sus datos son columnar. Los diferentes formatos Pandas espera que se discuten a continuación.

Los datos que usted están intentando analizar desde https://cws01.worldstores.co.uk/api/product.php?product_sku=125tSOt0111 Hace no parece ajustarse a ninguno de los formatos compatibles , ya que parece ser solo un solo "registro". Pandas espera algún tipo de colección.

Probablemente debería intentar recolectar varias entradas en un solo archivo, luego analizarlo con la función Series2 .

Editar:

forma sencilla de obtener múltiples filas y analizarlo con el pandas.read_json Función:

  import urllib2 import pandas as pd   url_base = "https://cws01.worldstores.co.uk/api/product.php?product_sku={}" products = ["125T:FT0111", "125T:FT0111", "125T:FT0111"]  raw_data_list = []  for sku in products:     url = url_base.format(sku)     raw_data_list.append(urllib2.urlopen(url).read())  data = "[" + (",".join(raw_data_list)) + "]" data = pd.read_json(data, orient='records') data   

/ editar

Mi opinión sobre los formatos de función Pandas.Read_Json.

El pandas.read_json función es otro ejemplo brillante de pandas que intentan atascarse la mayor funcionalidad posible en una sola función. Esto lleva por supuesto a una función muy muy complicada.

serie

Si sus datos son un Series , 9988777667 Predeterminado en 'index'

Los valores permitidos para Oriente al analizar un Series son: orient=0

Tenga en cuenta que el índice de la serie debe ser único para orient=1111 .

DataFrame

Si sus datos son un orient=2 , orient=3 Predeterminado en orient=4

Los valores permitidos para Orientn al analizar un orient=5 son: orient=6

Tenga en cuenta que el índice de la serie debe ser único para orient=7 y orient=8 , y las columnas de datos de datos deben ser únicas para orient=9 , read_json0 , y read_json1 .

Formato

No importa si sus datos son un read_json2 read_json3 , el 99887776624 esperará datos en el mismo formato:

Split

espera una representación de una cadena de un DICT como cuál es el constructor read_json525 :

  read_json6  

Registros

espera una representación de cadena de una lista de dicts como:

  read_json7  

NOTA No hay un conjunto de índice aquí.

Índice

espera una representación de cadena de un DICT DICT anidado como:

  read_json8  

Es bueno tener en cuenta es que no aceptará indicaciones de otros tipos que las cadenas. Puede ser arreglado en versiones posteriores.

Columnas

espera una representación de cadena de un dict anidado como:

  read_json9  

Valores

espera una representación de cadena de una lista como:

  pandas.read_json0  

Frame de datos resultante

En la mayoría de los casos, el contexto de datos que obtiene se verá así, con las cadenas JSON anteriores:

  pandas.read_json1  
 

The pandas.read_json function takes multiple formats.

Since you did not specify which format your json file is in (orient= attribute), pandas will default to believing your data is columnar. The different formats pandas expects are discussed below.

The data that you are trying to parse from https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111 Does not seem to conform to any of the supported formats as it seems to be only a single "record". Pandas expects some kind of collection.

You probably should try to collect multiple entries into a single file, then parse it with the read_json function.

EDIT:

Simple way of getting multiple rows and parsing it with the pandas.read_json function:

import urllib2 import pandas as pd   url_base = "https://cws01.worldstores.co.uk/api/product.php?product_sku={}" products = ["125T:FT0111", "125T:FT0111", "125T:FT0111"]  raw_data_list = []  for sku in products:     url = url_base.format(sku)     raw_data_list.append(urllib2.urlopen(url).read())  data = "[" + (",".join(raw_data_list)) + "]" data = pd.read_json(data, orient='records') data 

/EDIT

My take on the pandas.read_json function formats.

The pandas.read_json function is yet another shining example of pandas trying to jam as much functionality as possible into a single function. This leads of course to a very very complicated function.

Series

If your data is a Series, pandas.read_json(orient=) defaults to 'index'

The values allowed for orient while parsing a Series are: {'split','records','index'}

Note that the Series index must be unique for orient='index'.

DataFrame

If your data is a DataFrame, pandas.read_json(orient=) defaults to 'columns'

The values allowed for orient while parsing a DataFrame are: {'split','records','index','columns','values'}

Note that the Series index must be unique for orient='index' and orient='columns', and the DataFrame columns must be unique for orient='index', orient='columns', and orient='records'.

Format

No matter if your data is a DataFrame or a Series, the orient= will expect data in the same format:

Split

Expects a string representation of a dict like what the DataFrame constructor takes:

{"index":[1,2,3,4], "columns":["col1","col2"], "data":[[8,7,6,5], [5,6,7,8]]} 

Records

Expects a string representation of a list of dicts like:

[{"col1":8,"col2":5},{"col1":7,"col2":6},{"col1":6,"col2":7},{"col1":5,"col2":8}] 

Note there is no index set here.

Index

Expects a string representation of a nested dict dict like:

{"1":{"col1":8,"col2":5},"2":{"col1":7,"col2":6},"3":{"col1":6,"col2":7},"4":{"col1":5,"col2":8}} 

Good to note is that it won't accept indicies of other types than strings. May be fixed in later versions.

Columns

Expects a string representation of a nested dict like:

{"col1":{"1":8,"2":7,"3":6,"4":5},"col2":{"1":5,"2":6,"3":7,"4":8}} 

Values

Expects a string representation of a list like:

[[8, 5],[7, 6],[6, 7],[5, 8]] 

Resulting dataframe

In most cases, the dataframe you get will look like this, with the json strings above:

   col1  col2 1     8     5 2     7     6 3     6     7 4     5     8 
 
 
1
 
vote

Tal vez esta no sea la solución más elegante, sin embargo, me devuelve lo que quiero, o al menos lo creo, siéntase libre de advertir si algo está mal

  pandas.read_json2  
 

Maybe this is not the most elegant solution however gives me back what I want, or at least I believe so, feel free to warn if something is wrong

url = "https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111" data = urllib2.urlopen(url).read() data = json.loads(data) data = pd.DataFrame(data.items()) data = data.transpose() 
 
 
 
 
0
 
vote

Otra solución es usar un intento excepto.

  pandas.read_json3  
 

Another solution is to use a try except.

json_path='https://cws01.worldstores.co.uk/api/product.php?product_sku=125T:FT0111' try: a=pd.read_json(json_path) except ValueError: a=pd.read_json("["+json_path+"]") 
 
 
0
 
vote

iterando en la respuesta de @ firelynx:

  #! /usr/bin/env python3  from urllib.request import urlopen import pandas as pd  products = ["125T:FT0111", "125T:FT0111", "125T:FT0111"] raw_lines = "" for sku in products:     url = f"https://cws01.worldstores.co.uk/api/product.php?product_sku={sku}"     raw_lines += urlopen(url).read() + " "  data = pd.read_json(raw_lines, lines=True)   

Esto apoyará cualquier fuente que devuelva un solo objeto JSON o un montón de nueva línea (' n') separados.

o este one-liner (ish) debe funcionar el mismo:

  #! /usr/bin/env python3  import pandas as pd  products = ["125T:FT0111", "125T:FT0111", "125T:FT0111"] data = pd.concat(     pd.read_json(         f"https://cws01.worldstores.co.uk/api/product.php?product_sku={sku}",         lines=True     ) for sku in products )   

PS: Python3 es solo para el soporte de Fiers aquí, por lo que debe usar STR.Format para la compatibilidad de Python2.

 

Iterating on @firelynx's answer:

#! /usr/bin/env python3  from urllib.request import urlopen import pandas as pd  products = ["125T:FT0111", "125T:FT0111", "125T:FT0111"] raw_lines = "" for sku in products:     url = f"https://cws01.worldstores.co.uk/api/product.php?product_sku={sku}"     raw_lines += urlopen(url).read() + "\n"  data = pd.read_json(raw_lines, lines=True) 

This would support any source returning a single JSON object or a bunch of newline ('\n') separated ones.

Or this one-liner(ish) should work the same:

#! /usr/bin/env python3  import pandas as pd  products = ["125T:FT0111", "125T:FT0111", "125T:FT0111"] data = pd.concat(     pd.read_json(         f"https://cws01.worldstores.co.uk/api/product.php?product_sku={sku}",         lines=True     ) for sku in products ) 

PS: python3 is only for fstring support here, so you should use str.format for python2 compatibility.

 
 

Relacionados problema

0  Coincidencia de cadenas en Python Pandas DataFrame cuando hay diferentes posibilidades  ( String match in python pandas dataframe when there is different possibilities ) 
Ingrese la descripción de la imagen aquí Tengo un conteo de datos (300,000 filas) con 4 columnas. Tengo una columna "Modelo" donde tengo los siguientes va...

8  Añadir la tasa de cambio a Pandas DataFrame  ( Add rate of change to pandas dataframe ) 
Tengo el siguiente fábrico de datos de Pandas: lastrun value 0 2013-10-24 13:10:05+00:00 55376 1 2013-...

1  Pandas DataFrame al diccionario con tuplas como clave y valores  ( Pandas dataframe to dictionary with tuples as key and values ) 
Necesito ayuda para hacer lo siguiente: Tengo un archivo CSV como lo siguiente, cargado en un Frame 'DF'. Hay varias regiones, diferentes valores para la me...

2  Cambiar filas en pandas  ( Change rows in pandas ) 
Tengo una matriz en marco de datos de Pandas print dfMatrix 0 1 2 3 4 0 10000 10 8 11 10 1 10 100000 ...

1  ¿Puedes usar Pandas Groupby para agrupar filas, determinado sumando un valor de columna?  ( Can you use pandas groupby to group rows determined by summing a column value ) 
Me gustaría agrupar filas en un contexto de datos por valores de una columna. El ejemplo dado a continuación sería si estuviera agrupando los valores de 'Numb...

0  Fusionar con el minuto más cercano usando Pandas  ( Merge with the nearest minute using pandas ) 
Simplemente quiero fusionar dos cuadros de datos dentro de ± 1 min. AQUÍ NAME_DF con el conjunto de datos de muestra: Name Date A 2/19/2019 17:1...

0  El valor de la verdad de una serie es ambiguo. ¿Cómo puedo arreglar este error? [duplicar]  ( The truth value of a series is ambiguous how do i fix this error ) 
Esta pregunta ya tiene respuestas aquí : El valor de la verdad de una serie es ambiguo. Use A.EMPTY,...

2  Pandas Groupby y Selector orden  ( Pandas groupby and selector order ) 
Di que tengo un contexto de datos con 3 columnas: Criteria Group Value 0 A 0 0.1 1 B 0 0.2 2 B 1 0.3 3 B ...

-1  ¿Cómo lo convierto en este código OUTERHTML para sacar ciertos datos? (No sé cómo visualizarlo, así que quiero probar esto)  ( How do i loop over this outerhtml code to get out certain data i dont know ho ) 
Estoy tratando de obtener una lista que coincida con los distritos de la India a sus códigos de distrito, ya que fueron durante el censo de la población de 20...

2  Python MultiPhreading no aumenta la velocidad  ( Python multithreading doesnt increase speed ) 
Tengo 2 archivos separados que contienen las coordenadas de un lugar y el otro que contiene la calle y el código postal. Mediante el uso de pandas Quiero ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos