如何仅用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
相关产品推荐
相关产品推荐

