如何用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
假设你已经加载成了这样的初始结构(每行是一个分类,列是包含多个值的列表):
| index | A | B | ... |
|---|---|---|---|
| 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
相关产品推荐
相关产品推荐

