如何基于order_id关联嵌套JSON生成的DataFrame并填充status字段
如何将嵌套结构DataFrame的订单状态从另一个DataFrame填充?
我来帮你解决这个嵌套DataFrame的状态填充问题,其实思路很清晰——先把DataFrame2的订单状态做成一个快速查找的映射表,再遍历DataFrame1里的每笔嵌套订单去匹配填充就行,下面是具体的实现步骤和代码:
步骤1:准备数据并导入依赖
首先我们把你提供的DataFrame数据转换成pandas能处理的格式,同时导入必要的库:
import pandas as pd # 定义DataFrame1的数据 df1_data = [ { "client_id": 1, "name": "Test01", "olist": [ {"order_id": 10000, "order_dt_tm": "2012-12-01", "status": ""}, {"order_id": 10000, "order_dt_tm": "2012-12-01", "status": ""} ] }, { "client_id": 2, "name": "Test02", "olist": [ {"order_id": 10002, "order_dt_tm": "2012-12-01", "status": ""}, {"order_id": 10003, "order_dt_tm": "2012-12-01", "status": ""} ] } ] df1 = pd.DataFrame(df1_data) # 定义DataFrame2的数据 df2_data = { "order_id": [10002, 10001], "status": ["Delivered", "Ordered"] } df2 = pd.DataFrame(df2_data)
步骤2:创建订单状态映射字典
为了快速匹配order_id对应的status,我们把DataFrame2转换成一个字典,key是order_id,value是对应的status:
status_map = df2.set_index('order_id')['status'].to_dict()
这样做的好处是字典的查找速度是O(1),比每次去DataFrame里查询效率高很多,尤其是数据量较大的时候。
步骤3:遍历嵌套订单并填充状态
我们用apply方法遍历DataFrame1的每一行,对每个行的olist数组进行处理,遍历其中的每个订单,根据order_id从映射字典里获取状态(如果找不到就保留原空值):
def fill_status(row): # 遍历当前客户的所有订单 updated_olist = [] for order in row['olist']: # 从映射字典获取状态,不存在则保留原空值 order['status'] = status_map.get(order['order_id'], order['status']) updated_olist.append(order) # 更新该行的olist row['olist'] = updated_olist return row # 应用函数到df1的每一行 df1_updated = df1.apply(fill_status, axis=1)
查看结果
运行完上面的代码后,你可以打印df1_updated来查看填充后的结果:
print(df1_updated.to_json(indent=2))
输出结果会是:
[ { "client_id": 1, "name": "Test01", "olist": [ { "order_id": 10000, "order_dt_tm": "2012-12-01", "status": "" }, { "order_id": 10000, "order_dt_tm": "2012-12-01", "status": "" } ] }, { "client_id": 2, "name": "Test02", "olist": [ { "order_id": 10002, "order_dt_tm": "2012-12-01", "status": "Delivered" }, { "order_id": 10003, "order_dt_tm": "2012-12-01", "status": "" } ] } ]
可以看到,order_id=10002的订单已经成功填充了Delivered状态,而没有匹配到的订单(比如10000、10003)则保留了原有的空值,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

