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

如何重塑含多列表结构的Python字典并生成扁平化Pandas DataFrame

问题描述

我有如下格式的字典对象,需要将其扁平化后转换为Pandas DataFrame,要求每个键值对作为独立列。其中supplementalFieldValues列表中的每个id需要作为DataFrame的列名,对应的value作为该列的取值。

尝试使用pd.json_normalize()方法时,排除supplementalFieldValues能得到预期的基础DataFrame,但无法同时将supplementalFieldValues中的键值对转为独立字段。我考虑过先处理不含supplementalFieldValues的原数据,再将supplementalFieldValues重塑后合并,但不确定该方案是否可行。

字典示例:

{
    "classification": [
        {
            "classificationId": "OperatingExpense",
            "taxonomyId": "accounting.gp"
        }
    ],
    "supplementalFieldValues": [
        {
            "id": "Account Class",
            "value": "Expense"
        },
        {
            "id": "Account Type",
            "value": "Expense"
        },
        {
            "id": "Account Subtype",
            "value": "PayrollExpenses"
        }
    ],
    "id": "182",
    "name": "Payroll - Admin",
    "userAssignedCode": "60100"
}

预期输出:

idnameuserAssignedCodeclassification.classificationIdclassification.taxonomyIdAccount ClassAccount TypeAccount Subtype
182Payroll - Admin60100OperatingExpenseaccounting.gpExpenseExpensePayrollExpenses

解决方案

你的拆分处理后合并的思路完全可行,这里提供两种实现方式:

方法一:拆分处理+合并

这种方式逻辑清晰,适合快速实现:

  1. 处理基础数据:用json_normalize处理原数据,排除supplementalFieldValues得到基础DataFrame
import pandas as pd

# 假设你的数据是包含多个上述字典的列表
data = [
    {
        "classification": [{"classificationId": "OperatingExpense", "taxonomyId": "accounting.gp"}],
        "supplementalFieldValues": [{"id": "Account Class", "value": "Expense"}, {"id": "Account Type", "value": "Expense"}, {"id": "Account Subtype", "value": "PayrollExpenses"}],
        "id": "182",
        "name": "Payroll - Admin",
        "userAssignedCode": "60100"
    }
]

base_df = pd.json_normalize(data, exclude=['supplementalFieldValues'])
  1. 处理supplementalFieldValues:将每个子字典转为以id为键、value为值的字典,再转为DataFrame
supplemental_list = []
for item in data:
    supplemental_dict = {field['id']: field['value'] for field in item['supplementalFieldValues']}
    supplemental_list.append(supplemental_dict)
supplemental_df = pd.DataFrame(supplemental_list)
  1. 合并DataFrame:按列合并两个DataFrame
final_df = pd.concat([base_df, supplemental_df], axis=1)

方法二:自定义扁平化函数

如果需要处理更复杂的嵌套场景,或者想一步完成,可以自定义扁平化函数:

def flatten_item(item):
    flat_dict = {}
    for key, val in item.items():
        if key == 'supplementalFieldValues':
            # 处理supplementalFieldValues的键值对
            for field in val:
                flat_dict[field['id']] = field['value']
        elif isinstance(val, list) and val and isinstance(val[0], dict):
            # 处理classification这类列表嵌套字典的字段
            for sub_key, sub_val in val[0].items():
                flat_dict[f"{key}.{sub_key}"] = sub_val
        else:
            # 普通字段直接加入
            flat_dict[key] = val
    return flat_dict

# 扁平化所有数据项后转成DataFrame
flattened_data = [flatten_item(item) for item in data]
final_df = pd.DataFrame(flattened_data)

两种方法都能得到你需要的扁平化结果,可根据数据复杂度选择。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:19:57