如何将API获取的字典转换为指定列的Pandas DataFrame?
问题解决:API数据转Pandas DataFrame列异常处理
问题根源
你当前的代码把每个日期范围对应的完整JSON响应作为字典值存入data_2015,直接转DataFrame时,Pandas会把JSON的顶层字段(比如StudyFieldsResponse、Expression)作为行,日期范围作为列,这就是你看到异常列的原因。实际需要的研究数据嵌套在JSON响应的StudyFieldsResponse.StudyFields路径下。
修正后的代码
import requests import json import pandas as pd # 初始化空列表收集所有研究数据 all_studies = [] all_dates_2015 = ['1/1/2015,2/1/2015', '2/2/2015,3/2/2015', '3/3/2015,4/3/2015', '4/4/2015,5/4/2015', '5/5/2015,6/5/2015', '6/6/2015,7/6/2015', '7/7/2015,8/7/2015', '8/8/2015,9/8/2015', '9/9/2015,10/9/2015', '10/10/2015,11/10/2015', '11/11/2015,12/11/2015'] for date_range in all_dates_2015: # 发送API请求 rr = requests.get( 'https://clinicaltrials.gov/api/query/study_fields?expr=AREA[LocationCountry]United%20States%20AND%20AREA[StudyFirstPostDate]RANGE[{}]%20AND%20AREA[OverallStatus]Recruiting&fields=NCTId,OverallStatus,Condition,InterventionName,LocationCity,LocationState,LocationCountry,BriefSummary&max_rnk=1000&fmt=json'.format(date_range) ) json_data = json.loads(rr.text) # 提取实际的研究数据列表(注意路径:StudyFieldsResponse -> StudyFields) study_list = json_data['StudyFieldsResponse']['StudyFields'] # 将当前日期范围的所有研究数据追加到大列表 all_studies.extend(study_list) # 用收集到的所有研究数据创建DataFrame df = pd.DataFrame(all_studies) print(df)
额外处理建议
部分字段(比如InterventionName、Condition)可能返回列表格式(一个研究可能有多个干预措施/病症),如果需要将其转为字符串,可以添加以下处理:
# 处理列表类型的字段,转为逗号分隔的字符串 list_fields = ['InterventionName', 'Condition', 'LocationCity', 'LocationState'] for field in list_fields: df[field] = df[field].apply(lambda x: ', '.join(x) if isinstance(x, list) else x)
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

