如何将含多列的嵌套JSON字典解析为Pandas DataFrame?
嘿,我完全懂这种被嵌套JSON搞疯的感觉——尤其是当它堆了一大堆列的时候!我之前也踩过一模一样的坑,给你分享几个亲测有效的方法,应该能帮你把乱糟糟的嵌套数据拆成清晰可看的Pandas DataFrame列。
方法1:用
pd.json_normalize()深度解析 这绝对是处理嵌套JSON的首选工具,Pandas专门为这个场景做了优化,比自己写循环靠谱多了。
如果你的API响应是包含字典的列表(这是最常见的API返回格式),直接用下面的代码就行:
import pandas as pd # 假设你的API响应存在response变量里 df = pd.json_normalize(response)
要是嵌套层级特别深,还可以用sep参数指定层级分隔符,比如用下划线把父键和子键连起来,避免列名混乱:
df = pd.json_normalize(response, sep='_')
如果JSON里还有嵌套的数组字段(比如某个键对应一个列表),可以用record_path指定要展开的数组,再用meta保留外层的关键字段:
# 比如response里的'orders'是嵌套数组,同时保留外层的'user_id'和'user_name' df = pd.json_normalize( response, record_path='orders', meta=['user_id', 'user_name'] )
方法2:手动递归拆解极端复杂的嵌套
要是遇到那种字典套数组再套字典的变态结构,json_normalize可能会有点吃力,这时候可以写个简单的递归函数来扁平化每个条目:
def flatten_json(nested_json, exclude=['']): out = {} def flatten(x, name=''): # 处理字典类型 if isinstance(x, dict): for key in x: if key not in exclude: flatten(x[key], name + key + '_') # 处理列表类型 elif isinstance(x, list): for idx, item in enumerate(x): flatten(item, name + str(idx) + '_') # 处理基础数据类型(字符串、数字等) else: out[name[:-1]] = x flatten(nested_json) return out # 把每个响应条目都扁平化,再转成DataFrame flattened_data = [flatten_json(item) for item in response] df = pd.DataFrame(flattened_data)
这个函数会把所有嵌套层级都展开,用下划线连接,列表里的元素会带上索引前缀,比如列表第一个元素的键会变成0_xxx,方便你区分。
方法3:先搞清楚JSON的真实结构
很多时候卡壳是因为我们没摸透JSON的层级,先打印格式化后的响应看看:
import json # 把响应转成带缩进的字符串,一目了然 print(json.dumps(response, indent=4))
看完结构你就知道哪些是要展开的数组,哪些是外层的元数据,再针对性用上面的方法处理就轻松多了。
几个常见小坑提醒
- 如果API响应是一个大字典,里面的
data或者results字段才是你要的列表,记得先提取:df = pd.json_normalize(response['data']) - 遇到空值也不用慌,Pandas会自动把它们转成
NaN,后续可以用df.fillna()处理
内容的提问来源于stack exchange,提问作者RustyShackleford
相关产品推荐
相关产品推荐

