You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:18:13