json_normalize не удается выровнять столбец, представляющий собой список словаря

#python #json #pandas #python-requests

Вопрос:

Я долгое время пытался выровнять столбец sellers.price_data, но безуспешно. sellers.price_data-это последний столбец в таблице, выводимой ниже. Чтобы получить этот вывод, мне пришлось нормализовать и развернуть данные, предоставленные по ссылке api в моем коде ниже.

 sku product_name map_price sellers.seller_name sellers.website_url sellers.price_data 0 P350022-141 P350022-141 1-60W MED FLUSH MOUNT - Galvanized... 47.00 amazon https://www.amazon.com/dp/B08NC8LKFY [{'date': '2021-10-12', 'price': '47.99'}] 1 P350022-141 P350022-141 1-60W MED FLUSH MOUNT - Galvanized... 47.00 homedepot https://www.google.com/aclk?sa=Lamp;ai=DChcSEwioy... [{'date': '2021-10-12', 'price': '59.99'}] 2 P350022-141 P350022-141 1-60W MED FLUSH MOUNT - Galvanized... 47.00 lowes https://www.google.com/aclk?sa=Lamp;ai=DChcSEwioy... [{'date': '2021-10-12', 'price': '64.76'}] 3 P350022-141 P350022-141 1-60W MED FLUSH MOUNT - Galvanized... 47.00 overstock https://www.overstock.com/32533008/product.htm... [{'date': '2021-10-12', 'price': '59.99'}] 4 P350022-141 P350022-141 1-60W MED FLUSH MOUNT - Galvanized... 47.00 canadalightingexperts https://www.canadalightingexperts.com/lighting... [{'date': '2021-10-12', 'price': '47.99'}]  

Код для вывода:

 import pandas as pd import requests import json from tabulate import tabulate   response = 'https://mschannellogin.com/Api/produc_matrix_tier_1?api_key=x' requests.get(response).json() json_text = requests.get(response).json()  # ESTABLISH WHAT ARE THE OUTERMOST KEYS for i in json_text:  print(i) # STATUS, MESSAGE, DATA ARE THE 3 OUTERMOST KEYS  # GO INSIDE OF 'data' parse_json_text=[] for i in json_text['data']:  parse_json_text.append(i)  pd.options.display.width=None print(tabulate(pd.DataFrame(parse_json_text).head()))    # DEAL WITH COLUMNS THAT ARE STILL LISTS data_df=pd.DataFrame(json_text['data']) print(data_df.head(4))  print(tabulate(data_df.loc[:,['sku', 'product_name', 'map_price', 'sellers']]))  mod_df=data_df.loc[:,['sku', 'product_name', 'map_price', 'sellers']] for i in mod_df:  mod_df=mod_df.explode(i) print(tabulate(mod_df.head(9)))   flat_dct=pd.json_normalize(json.loads(mod_df.  to_json(orient="records")))  flat_dct = pd.DataFrame(flat_dct) print(flat_dct.head())  

Ключ «данные» распознает только артикул, название продукта, цену карты и продавцов. Я не знаю, как повторно просмотреть столбец price_data.

Моя конечная цель-внедрить это в PowerBI с помощью скрипта на python. Он работает последний выпуск-это столбец sellers.price_data.

Любые предложения, я долго работал над этим, но безуспешно, спасибо.

Ответ №1:

IIUC, ты хочешь:

 mod_df = data_df.explode("sellers").reset_index(drop=True) flat_df = mod_df.drop("sellers", axis=1)  .join(pd.json_normalize(mod_df["sellers"],   record_path="price_data",   meta=["seller_name", "website_url"]  )  )  

Комментарии:

1. Замечательно! Спасибо, что это сработало @not_speshal.

2. Рад помочь @amcgill2 !

Ответ №2:

Вы можете использовать json_normalize и указывать meta параметры.

 pd.json_normalize(  json_text["data"],  record_path=["sellers", "price_data"],  meta=[  "sku",  "product_name",  "map_price",  ["sellers", "seller_name"],  ["sellers", "website_url"],  ], )  

Это произведенные колонки:

 ['date',  'price',  'sku',  'product_name',  'map_price',  'sellers.seller_name',  'sellers.website_url']