#python #json #dictionary #nested
#python #json #словарь #вложенный
Вопрос:
Прошу прощения, если это не имеет смысла, но я объяснил это как можно лучше.
У меня есть 2 объекта json в python (orderdetails, orderlines) с общим полем (order_id)
Для каждого из {данных в скобках с тем же order_id, что и orderdetails} в orderlines мне нужно добавить и вложить их в детали заказа, чтобы конечный результат выглядел так: Конечный результат
orderdetails — это большие данные, а orderlines — это небольшие данные.
Мои данные извлекаются из SQL, а затем преобразуются впоследствии в dataframe, а затем в json.
Я рассмотрел несколько вопросов по этому поводу, но большинство из них на самом деле не относятся к тому, что я хочу сделать.
Вот приведенный ниже код, который у меня есть в настоящее время:
from func.excelfunction import *
from datetime import datetime as dt
from datetime import timedelta
import requests
import csv
import os
import math
from sql_server.sql_server import *
import pandas as pd
import json
#variables
dir_path = os.path.dirname(os.path.realpath(__file__))
df1 = run_sql_df('SET NOCOUNT ON; exec isawitfirstdb.dbo.usp_Torque_orderDetails')
df1 = df1.astype({"created_at":"str","order_number":"str","order_id":"int64","instructions":"str","dispatch_method":"str","email":"str","Contact":"str",
"name":"str","address_1":"str","address_2":"str","town":"str","county":"str","postcode":"str","country":"str","invoice_currency":"str",
"subtotal_price":"str","total_price":"str","invoice_name":"str","invoice_contact_phone":"str","invoice_address_1":"str","invoice_address_2":"str",
"invoice_town":"str","invoice_county":"str","invoice_postcode":"str","inovice_country":"str","Owner_id":"str","Merge_status":"str","Merge_action":"str","Record_type":"str"})
df2 = run_sql_df('SET NOCOUNT ON; exec isawitfirstdb.dbo.usp_Torque_orderLineDetails')
df2 = df2.astype({"sku_id":"str","order_id":"int64","qty_ordered":"int64","user_def_type_1":"str","user_def_type_2":"str","user_def_num_1":"str","line_value":"int64","config_id":"str","Merge_status":"str","Merge_action":"str","Record_type":"str"})
#convert to dataframe
orders = pd.DataFrame(df1)
orderlines = pd.DataFrame(df2)
#convert to dataframe to json
orders = orders.to_json(orient="records")
orderlines = orderlines.to_json(orient="records")
# JSON
df = orders orderlines
print(df)
Ответ №1:
Используйте some_dict.update({'some_exclusive_key': some_object})
для добавления к dict
Ответ №2:
Я предполагаю, что для каждого order_id
в orders
существует только одна запись, но в orderlines
может существовать несколько. Если это так, вы можете выполнить итерацию по списку заказов и для каждой записи добавить новое поле со списком, orderlines
которые соответствуют этому order_id
. Вы можете получить этот список с помощью filter()
new_list = []
for rec in orders:
order_id = rec.get('order_id')
matching_orderlines = list(filter(lambda ol: ol['order_id'] == order_id, orderlines))
new_list.append({*rec,'lines':matching_orderlines})
Я также предполагаю, что ключ order_id
всегда существует. если нет, замените скобки на .get()
. Я не тестировал приведенный выше код…