如何使用pandas.json_normalize时避免列名带嵌套前缀?
解决方法
方法1:手动合并顶层与嵌套数据(无需json_normalize)
直接把顶层字典和嵌套的子字典合并后转成DataFrame,列名天然不带前缀:
import pandas as pd d = { "username": "foo999", "email": "bar999@example.com", "address": { "city": "Faketown", "state": "Fakeshire" }, "is_premium_user": True, } # 合并顶层数据与嵌套的address数据 flattened_data = {**{k: v for k, v in d.items() if k != "address"}, **d["address"]} df = pd.DataFrame([flattened_data])
输出结果:
username email is_premium_user city state 0 foo999 bar999@example.com True Faketown Fakeshire
这种方式逻辑直观,适合结构简单的嵌套场景,不需要依赖json_normalize的参数配置。
方法2:自动提取列名的最后一段(通用处理)
如果必须使用json_normalize,可以对生成的列名做通用处理——直接保留.分隔后的最后一部分,不用提前知晓所有嵌套键:
import pandas as pd d = { "username": "foo999", "email": "bar999@example.com", "address": { "city": "Faketown", "state": "Fakeshire" }, "is_premium_user": True, } df = pd.json_normalize(d) # 提取列名的最后一段,自动去掉所有前缀 df.columns = df.columns.str.split('.').str[-1]
这个方法适配任意嵌套父键名称,完全不用手动维护正则里的键列表,通用性拉满。
方法3:自定义递归展平函数(适配复杂嵌套)
如果存在多层嵌套或多个嵌套字段,写一个递归函数先把字典完全展平,再转成DataFrame:
import pandas as pd def flatten_dict(d): items = [] for k, v in d.items(): if isinstance(v, dict): items.extend(flatten_dict(v).items()) else: items.append((k, v)) return dict(items) d = { "username": "foo999", "email": "bar999@example.com", "address": { "city": "Faketown", "state": "Fakeshire" }, "is_premium_user": True, } flattened_data = flatten_dict(d) df = pd.DataFrame([flattened_data])
该函数会递归处理所有层级的嵌套字典,自动去掉所有父键前缀,适合结构复杂的嵌套数据。
内容的提问来源于stack exchange,提问作者user21474411
相关产品推荐
相关产品推荐

