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

如何仅用Pandas函数将DataFrame中JSON字符串列拆分为多列并展开?

解决方法:用Pandas解析JSON列并展开为多行多列

我来给你一步步拆解怎么用纯Pandas函数实现这个需求,全程不需要额外循环或自定义函数,完全依赖Pandas内置方法:

步骤1:构造示例数据(模拟你的输入)

先把你给出的示例数据转换成Pandas DataFrame:

import pandas as pd
import json

# 原始输入数据
raw_data = [
    ["id1", '{"c1": ["a","b"], "c2": [0.1, 0.2], "c3": ["3","1"]}'],
    ["id2", '{"c1": ["c","d"], "c2": [0.7, 0.4], "c3": ["8","4"]}']
]
df = pd.DataFrame(raw_data, columns=["id", "json_col"])

步骤2:解析JSON字符串为结构化列

把存储JSON字符串的列转换成Pandas能识别的结构化数据:

# 将JSON字符串转为Python字典,再解析为多列
parsed_df = pd.json_normalize(df["json_col"].apply(json.loads))
# 合并原来的id列,保留每个id对应的JSON数据
merged_df = pd.concat([df["id"], parsed_df], axis=1)

这里json.loads负责把字符串转成字典,pd.json_normalize则把字典的key转换成列名,列表形式的value作为列值。

步骤3:将列表列展开为多行

现在每个列里都是列表,我们需要把这些列表元素拆成单独的行,同时保证同一id下的c1、c2、c3元素一一对应:

# 对所有目标列执行explode操作,同步拆分列表
final_df = merged_df.explode(["c1", "c2", "c3"]).set_index("id")

explode方法会把每个列表中的元素拆成独立行,Pandas会自动保证多个列的拆分是同步的(只要每个列的列表长度一致,你的示例数据满足这个条件)。最后用set_index("id")把id设为索引,就和你期望的输出格式完全一致了。

简化的链式写法

如果你喜欢更简洁的代码,可以把所有步骤串起来:

final_df = (df
            .assign(json_dict=lambda x: x["json_col"].apply(json.loads))
            .pipe(lambda x: pd.concat([x["id"], pd.json_normalize(x["json_dict"])], axis=1))
            .explode(["c1", "c2", "c3"])
            .set_index("id"))

验证结果

打印final_df就能得到你想要的输出:

c1   c2 c3
id
id1  a  0.1  3
id1  b  0.2  1
id2  c  0.7  8
id2  d  0.4  4

内容的提问来源于stack exchange,提问作者ooo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:48:39