pandas 的 dataframe 与 dict (json)转换

如何将含有一级嵌套的list转化为dataframe,然后列加列信息,再将其填充会原list

可以。你这个场景本质上是:

  1. 原始数据里有一层 list
  2. 先把它展开成 DataFrame
  3. DataFrame 里新增列或修改列
  4. 再把结果按原结构填回原来的 list

下面用一个完整例子说明。


一、原始数据

比如原始数据是这样,orders 是一级嵌套的 list:

data = [
    {
        "user_id": 1,
        "name": "Alice",
        "orders": [
            {"order_id": "A001", "amount": 100},
            {"order_id": "A002", "amount": 200}
        ]
    },
    {
        "user_id": 2,
        "name": "Bob",
        "orders": [
            {"order_id": "B001", "amount": 150}
        ]
    }
]

你想把 orders 拿出来变成 DataFrame,增加一列,比如 tax,最后再放回去。


二、list 转 DataFrame

pd.json_normalize() 最方便:

import pandas as pd

df = pd.json_normalize(
    data,
    record_path="orders",          # 要展开的 list 字段
    meta=["user_id", "name"]       # 上层字段一起带下来
)

print(df)

结果:

  order_id  amount user_id   name
0     A001     100       1  Alice
1     A002     200       1  Alice
2     B001     150       2    Bob

三、给 DataFrame 加列信息

比如增加税额 tax 和总金额 total

df["tax"] = df["amount"] * 0.1
df["total"] = df["amount"] + df["tax"]

print(df)

结果:

  order_id  amount user_id   name   tax  total
0     A001     100       1  Alice  10.0  110.0
1     A002     200       1  Alice  20.0  220.0
2     B001     150       2    Bob  15.0  165.0

四、再填回原 list

思路是:

  • user_id 分组
  • 每组重新变成 orders 列表
  • 再组装回原来的结构
result = []

for (user_id, name), group in df.groupby(["user_id", "name"]):
    item = {
        "user_id": user_id,
        "name": name,
        "orders": group[["order_id", "amount", "tax", "total"]].to_dict(orient="records")
    }
    result.append(item)

print(result)

结果:

[
    {
        'user_id': 1,
        'name': 'Alice',
        'orders': [
            {'order_id': 'A001', 'amount': 100, 'tax': 10.0, 'total': 110.0},
            {'order_id': 'A002', 'amount': 200, 'tax': 20.0, 'total': 220.0}
        ]
    },
    {
        'user_id': 2,
        'name': 'Bob',
        'orders': [
            {'order_id': 'B001', 'amount': 150, 'tax': 15.0, 'total': 165.0}
        ]
    }
]

这就完成了“展开 → 改列 → 填回”。


五、如果你想“直接覆盖原 data”

也可以直接回写到原对象里:

new_orders_map = {
    user_id: group[["order_id", "amount", "tax", "total"]].to_dict(orient="records")
    for user_id, group in df.groupby("user_id")
}

for item in data:
    item["orders"] = new_orders_map.get(item["user_id"], [])

print(data)

这样原来的 data 会被直接更新。


六、通用模板

你以后基本都可以按这个模板写:

import pandas as pd

data = [
    {
        "id": 1,
        "items": [
            {"x": 10, "y": 20},
            {"x": 30, "y": 40}
        ]
    },
    {
        "id": 2,
        "items": [
            {"x": 50, "y": 60}
        ]
    }
]

# 1. 展开 list -> DataFrame
df = pd.json_normalize(data, record_path="items", meta=["id"])

# 2. 新增列
df["z"] = df["x"] + df["y"]

# 3. 填回原 list
items_map = {
    id_: group[["x", "y", "z"]].to_dict(orient="records")
    for id_, group in df.groupby("id")
}

for item in data:
    item["items"] = items_map.get(item["id"], [])

print(data)

七、关键点

最重要的是保留一个能回填的主键,比如:

  • user_id
  • id
  • parent_id

因为你最后要靠它 groupby 再塞回去。

如果没有这个字段,展开以后就不容易准确还原。


八、如果原 list 只是单独一个字段

比如只有:

orders = [
    {"order_id": "A001", "amount": 100},
    {"order_id": "A002", "amount": 200}
]

那就更简单:

df = pd.DataFrame(orders)
df["tax"] = df["amount"] * 0.1

orders_new = df.to_dict(orient="records")
print(orders_new)

九、最简答案

你的需求可以概括成这三步:

# 1. list -> dataframe
df = pd.json_normalize(data, record_path="orders", meta=["user_id"])

# 2. 加列
df["new_col"] = ...

# 3. dataframe -> 回填 list
orders_map = {
    k: g[["order_id", "amount", "new_col"]].to_dict(orient="records")
    for k, g in df.groupby("user_id")
}
for item in data:
    item["orders"] = orders_map[item["user_id"]]

如果你把你的真实数据结构贴出来,我可以直接按你的字段名给你写成一版可直接运行的代码。

posted @ 2026-03-24 09:27  X1OO  阅读(3)  评论(0)    收藏  举报