如何将嵌套字典列表JSON转为Pandas DataFrame并去除冗余字段
高效将嵌套JSON列表转换为Pandas DataFrame(去除冗余entry字段)
确实,json_normalize在处理大规模数据时,因为要兼容各种复杂嵌套场景,会做很多额外的解析操作,速度难免拖慢。针对你这种每个元素只有entry这一层嵌套的特定场景,我们可以用更轻量化的针对性方案,效率提升非常明显。
方案1:列表推导式提取entry后构建DataFrame(首选)
这是最直观也最高效的方法,先把每个字典里的entry值提取出来,形成平级的字典列表,再交给Pandas构建DataFrame。因为避开了json_normalize的通用嵌套解析逻辑,纯Python列表操作+Pandas原生的平级数据处理,速度能提升好几倍:
import pandas as pd data = [{'entry':{'points': 50, 'time': '5:00', 'year': 2010}}, {'entry':{'points': 25, 'time': '6:00', 'month': "february"}}, {'entry':{'points':90, 'time': '9:00', 'month': 'january'}}, {'entry':{'points':20, 'month': 'june'}}] # 先提取所有entry的内容,得到平级字典列表 extracted_data = [item['entry'] for item in data] # 直接构建DataFrame df = pd.DataFrame(extracted_data)
方案2:用map函数简化代码
如果喜欢更简洁的写法,可以用map函数来提取entry,性能和列表推导式几乎一致,只是代码风格不同:
import pandas as pd data = [{'entry':{'points': 50, 'time': '5:00', 'year': 2010}}, {'entry':{'points': 25, 'time': '6:00', 'month': "february"}}, {'entry':{'points':90, 'time': '9:00', 'month': 'january'}}, {'entry':{'points':20, 'month': 'june'}}] df = pd.DataFrame.from_records(map(lambda x: x['entry'], data))
方案3:超大规模数据用Dask并行处理
如果你的数据量达到百万级甚至更大,单进程Pandas处理起来吃力,可以用Dask做并行化处理,拆分数据分区后同时提取转换:
import pandas as pd import dask.dataframe as dd data = [{'entry':{'points': 50, 'time': '5:00', 'year': 2010}}, {'entry':{'points': 25, 'time': '6:00', 'month': "february"}}, {'entry':{'points':90, 'time': '9:00', 'month': 'january'}}, {'entry':{'points':20, 'month': 'june'}}] # 转换为Dask DataFrame,设置分区数(根据CPU核心数调整) dask_df = dd.from_pandas(pd.DataFrame(data), npartitions=4) # 并行提取entry并展开为列 dask_df = dask_df.apply(lambda x: x['entry'], axis=1, meta=object).apply(pd.Series, meta={'points': int, 'time': str, 'month': str, 'year': int}) # 计算得到Pandas DataFrame df = dask_df.compute()
总结
以上方案都比json_normalize更高效,因为它们针对你这种固定单层嵌套的场景做了精准优化,跳过了通用嵌套解析的冗余步骤。其中列表推导式的方法最容易理解,性能也最优,适合绝大多数场景;如果数据量特别大,再考虑用Dask的并行方案。
内容的提问来源于stack exchange,提问作者AUK1939
相关产品推荐
相关产品推荐

