Python筛选JSON中指定reportSection的results并转为DataFrame
问题解决:筛选指定reportSection的results并转为DataFrame
问题背景
从API获取JSON数据后,需筛选出reportSection字段值为Report Detail的条目,提取其results数据并转换为Pandas DataFrame,但现有代码运行报错。
错误原因分析
原代码存在两个核心问题:
- 使用
pd.read_json(datapull)将JSON数组转为DataFrame后,for r in data实际迭代的是DataFrame的列名,而非每个JSON对象,导致后续处理逻辑完全偏离预期。 section_results函数中,section = record.get('reportSection', ...)获取到的是字符串类型的reportSection值,字符串没有get方法,调用section.get('results')会直接抛出属性错误。
正确实现代码
方法一:原生Python列表处理(逻辑直观)
import pandas as pd import json # 解析API返回的JSON文本为Python列表 datapull = response_API.text data_list = json.loads(datapull) # 筛选目标条目并收集results数据 target_results = [] for item in data_list: if item.get('reportSection') == 'Report Detail': target_results.extend(item.get('results', [])) # 转换为DataFrame df = pd.DataFrame(target_results) print(df)
方法二:Pandas原生操作(高效简洁)
import pandas as pd datapull = response_API.text # 读取JSON为DataFrame,每个JSON对象对应一行,results列为列表格式 df_raw = pd.read_json(datapull) # 筛选目标行,展开results列表并转为结构化DataFrame target_df = df_raw[df_raw['reportSection'] == 'Report Detail']['results'].explode().apply(pd.Series) print(target_df)
代码说明
- 方法一:先将JSON转为Python原生列表,遍历筛选符合条件的条目,用
extend合并所有目标results数据,最后转为DataFrame,适合新手理解逻辑。 - 方法二:利用Pandas的
explode拆分列表元素为单独行,再通过apply(pd.Series)将字典结构展开为列,适合熟悉Pandas操作的场景,代码更简洁。
内容的提问来源于stack exchange,提问作者mbjeter
相关产品推荐
相关产品推荐

