嵌套JSON转Pandas DataFrame:如何拆分form_data与form_files列(避免元数据行)
如何将嵌套JSON的form_data和form_files展开为Pandas DataFrame的独立列
我完全懂你这种被JSON嵌套结构卡壳的感觉——明明json_normalize已经帮了大忙,但form_data和form_files这种数组型嵌套就是搞不定,对吧?别担心,我来给你一套可行的解决方案,把这些嵌套内容拆成你想要的独立列。
分步解决方案
假设你的JSON数据已经加载为Python字典(如果是字符串格式,先用json.loads()转换),我们分三步处理:
1. 标准化第一层嵌套数据
先用json_normalize处理custom_status、category这类简单嵌套,先得到基础的DataFrame:
import pandas as pd import json # 假设你的原始JSON数据已经是字典格式 data = { "id": "0c576f35-d704-4fa8-8cbb-311c6be36358", ... } # 你的完整JSON字典 # 标准化第一层嵌套(比如custom_status、category) df_main = pd.json_normalize(data)
2. 展开form_data为独立列
form_data是一个包含field_id和values的数组,我们可以把每个field_id作为列名,values的第一个元素作为对应值(从你的数据看每个values都是单元素数组):
# 将form_data转换为键值对字典 form_data_dict = {item['field_id']: item['values'][0] for item in data['form_data']} # 转换为DataFrame df_form_data = pd.DataFrame([form_data_dict])
3. 处理form_files数据
form_files是文件信息数组,我们可以把每个文件的id、filename、field_id提取为带索引的独立列(支持多个文件的情况):
form_files_dict = {} for idx, file in enumerate(data['form_files']): form_files_dict[f'form_file_{idx}_id'] = file['id'] form_files_dict[f'form_file_{idx}_filename'] = file['filename'] form_files_dict[f'form_file_{idx}_field_id'] = file['field_id'] df_form_files = pd.DataFrame([form_files_dict])
4. 合并所有DataFrame
最后把基础数据、form_data展开数据、form_files数据合并成最终的DataFrame:
# 先删掉主DataFrame里的原始嵌套列,再合并 final_df = pd.concat( [df_main.drop(['form_data', 'form_files'], axis=1), df_form_data, df_form_files], axis=1 )
处理多个请求的情况
如果你的数据是包含多个请求的JSON数组,只需要把上面的逻辑封装成函数,循环处理每个请求再合并:
def process_single_request(request_data): # 处理主数据 df_main = pd.json_normalize(request_data) # 处理form_data form_data_dict = {item['field_id']: item['values'][0] for item in request_data['form_data']} df_form_data = pd.DataFrame([form_data_dict]) # 处理form_files form_files_dict = {} for idx, file in enumerate(request_data['form_files']): form_files_dict[f'form_file_{idx}_id'] = file['id'] form_files_dict[f'form_file_{idx}_filename'] = file['filename'] form_files_dict[f'form_file_{idx}_field_id'] = file['field_id'] df_form_files = pd.DataFrame([form_files_dict]) # 合并返回 return pd.concat([df_main.drop(['form_data', 'form_files'], axis=1), df_form_data, df_form_files], axis=1) # 假设data_list是多个请求的JSON字典列表 data_list = [request_1, request_2, request_3] final_df = pd.concat([process_single_request(req) for req in data_list], ignore_index=True)
这样处理后,你就能得到完全展开的DataFrame:form_data里的每个字段(比如subcategory、art-der-massnahme)都变成了独立列,form_files的信息也清晰地拆分成了单独的列,再也看不到嵌套的数组结构啦。
内容的提问来源于stack exchange,提问作者aliciavika
相关产品推荐
相关产品推荐

