#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']