如何高效将JSON对象转换为DataFrame?求优化方案
优化JSON转DataFrame的实现方案
需求
从input_df每行生成的JSON字符串(含suggestions数组,每个元素有suggestion/reason字段),转换为包含suggestion1、reason1至suggestion3、reason3列的DataFrame,现有代码可行但需更高效简洁的实现。
优化后的代码实现
import json import pandas as pd # 1. 封装JSON解析逻辑 def parse_suggestion_json(raw_str): # 清理JSON字符串中的多余标记(反引号、json标识、换行) cleaned = raw_str.replace('`', '').replace('json', '').replace('\n', '') # 解析并提取suggestions数组 return json.loads(cleaned)['suggestions'] # 2. 矢量化处理input_df的description列 # 用apply替代手动循环,利用pandas内部优化 suggestions_list = input_df['description'].apply( lambda desc: parse_suggestion_json(return_json_object(fr"""sample text ... {desc}?""")) ).tolist() # 3. 扁平化数据并生成目标DataFrame flat_rows = [] for suggestions in suggestions_list: row_dict = {} for idx, item in enumerate(suggestions, start=1): row_dict[f'suggestion{idx}'] = item['suggestion'] row_dict[f'reason{idx}'] = item['reason'] flat_rows.append(row_dict) suggestion_df = pd.DataFrame(flat_rows)
进一步简化的扁平化写法(字典推导式)
如果喜欢更紧凑的代码,可以用字典推导式替代内层循环:
flat_rows = [ { **{f'suggestion{i+1}': s['suggestion'] for i, s in enumerate(suggestions)}, **{f'reason{i+1}': s['reason'] for i, s in enumerate(suggestions)} } for suggestions in suggestions_list ] suggestion_df = pd.DataFrame(flat_rows)
核心优化点
- 减少手动循环:用
pandas.Series.apply替代for i in range(len(input_df)),利用pandas的矢量化操作提升效率,尤其在数据量大时更明显 - 代码模块化:将JSON解析逻辑封装为独立函数,提升可读性和可维护性
- 简化字符串处理:合并多次字符串替换操作,减少中间变量
- 可选批量优化:如果
return_json_object支持批量请求,可以一次性传入所有description,减少API调用次数(需根据该函数的实际实现调整)
内容的提问来源于stack exchange,提问作者Alan Chu2
相关产品推荐
相关产品推荐

