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

如何用Pandas高效将多列列表展开为行(含JSON加载优化)

嘿,我懂你这种用循环处理的痛苦——不仅代码啰嗦,数据量大的时候还慢得离谱。其实完全可以用Pandas的内置方法来搞定,甚至在加载JSON的阶段就直接处理好结构,不用等到转成DataFrame后再折腾。

我先假设你的JSON是最常见的「分类键对应条目列表」结构(比如type1/type2/type3作为键,对应的值是包含多列数据的字典列表),给你分场景说最优解法:


方案1:加载JSON时直接处理(推荐)

不用先转成带列表的初始DataFrame,直接把嵌套结构展开后再生成最终结果,用列表推导式就能搞定,比显式循环简洁高效:

import pandas as pd
import json

# 读取JSON文件
with open('your_data.json', 'r') as f:
    raw_data = json.load(f)

# 展开嵌套:把每个分类下的条目单独提取,同时添加分类标记
processed_data = [
    {**item, "category": category} 
    for category, items in raw_data.items() 
    for item in items
]

# 直接生成最终DataFrame
final_df = pd.DataFrame(processed_data)

这个列表推导式是Python原生的高效写法,比手动循环快得多,代码也更紧凑。


方案2:如果已经有了带列表的初始DataFrame

假设你已经加载成了这样的初始结构(每行是一个分类,列是包含多个值的列表):

indexAB...
type1[1, 3][2, 4]...
type2[5, 7][6, 8]...

那直接用Pandas的explode方法批量展开所有列表列,完全不用循环:

# 先把索引(分类名)转成普通列
initial_df = initial_df.reset_index().rename(columns={"index": "category"})

# 对所有包含列表的列执行explode,一次性展开
final_df = initial_df.explode(initial_df.columns[1:]).reset_index(drop=True)

explode是Pandas专门为列表列设计的矢量化方法,内部优化过,比手动循环效率高几个量级。


更复杂的嵌套JSON?用pd.json_normalize一步到位

如果你的JSON结构更复杂(比如外层是分类数组,每个分类里包含条目列表),像这样:

{
  "data": [
    {"type": "type1", "entries": [{"A":1, "B":2}, {"A":3, "B":4}]},
    {"type": "type2", "entries": [{"A":5, "B":6}, {"A":7, "B":8}]}
  ]
}

那直接用pd.json_normalize指定要展开的嵌套路径和要保留的上层字段,一步生成最终DataFrame:

import pandas as pd

df = pd.json_normalize(raw_data['data'], record_path='entries', meta='type')

总的来说,核心思路就是尽量用Pandas的矢量化方法或者在加载阶段预处理结构,避免手动循环——不仅代码更简洁,性能也会好很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:14:54