如何重塑含多列表结构的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" }
预期输出:
| id | name | userAssignedCode | classification.classificationId | classification.taxonomyId | Account Class | Account Type | Account Subtype |
|---|---|---|---|---|---|---|---|
| 182 | Payroll - Admin | 60100 | OperatingExpense | accounting.gp | Expense | Expense | PayrollExpenses |
解决方案
你的拆分处理后合并的思路完全可行,这里提供两种实现方式:
方法一:拆分处理+合并
这种方式逻辑清晰,适合快速实现:
- 处理基础数据:用
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'])
- 处理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)
- 合并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
相关产品推荐
相关产品推荐

