pandas 的 dataframe 与 dict (json)转换
如何将含有一级嵌套的list转化为dataframe,然后列加列信息,再将其填充会原list
可以。你这个场景本质上是:
- 原始数据里有一层
list - 先把它展开成
DataFrame - 在
DataFrame里新增列或修改列 - 再把结果按原结构填回原来的
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_ididparent_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"]]
如果你把你的真实数据结构贴出来,我可以直接按你的字段名给你写成一版可直接运行的代码。

浙公网安备 33010602011771号