如何将嵌套字典中的趋势数据展开并转换为Pandas DataFrame
问题描述
我有如下嵌套字典列表:
keywords_data=[{'vol': 90500, 'cpc': {'currency': '$', 'value': '4.64'}, 'keyword': 'coronary artery disease', 'competition': 0.15, 'trend': [{'month': 'September', 'year': 2021, 'value': 90500}, {'month': 'October', 'year': 2021, 'value': 90500}, {'month': 'November', 'year': 2021, 'value': 90500}, {'month': 'December', 'year': 2021, 'value': 74000}, {'month': 'January', 'year': 2022, 'value': 90500}, {'month': 'February', 'year': 2022, 'value': 110000}, {'month': 'March', 'year': 2022, 'value': 110000}, {'month': 'April', 'year': 2022, 'value': 110000}, {'month': 'May', 'year': 2022, 'value': 90500}, {'month': 'June', 'year': 2022, 'value': 90500}, {'month': 'July', 'year': 2022, 'value': 90500}, {'month': 'August', 'year': 2022, 'value': 90500}]}]
希望将其转换为如下结构的DataFrame:
keyword month year value coronary artery disease september 2021 90500 coronary artery disease october 2021 90500 coronary artery disease november 2021 90500 ...
我可以通过以下代码访问keyword、competition和cpc等字段:
vol = [] cpc = [] for element in keywords_data: vol.append(element["vol"]) cpc.append(element["cpc"]["value"])
但尝试用相同方式访问trend下的month字段时,出现错误提示“list indices must be slices or strings, not str”。请问如何将数据转换为上述指定结构的DataFrame?
解决方法
方法一:手动循环构建数据列表
报错原因是trend是列表类型,不能直接用字典键访问,需要先遍历trend里的每个子字典。可以手动构建目标格式的数据列表,再转为DataFrame:
import pandas as pd data_list = [] for element in keywords_data: keyword = element['keyword'] # 遍历每个月度趋势数据 for trend_item in element['trend']: data_list.append({ 'keyword': keyword, 'month': trend_item['month'].lower(), # 转为小写匹配示例格式 'year': trend_item['year'], 'value': trend_item['value'] }) df = pd.DataFrame(data_list) print(df)
方法二:使用pandas内置函数(简洁高效)
利用explode展开列表字段,再用json_normalize拆分字典字段,适合处理大规模数据:
import pandas as pd # 原始数据转为初始DataFrame df_initial = pd.DataFrame(keywords_data) # 展开trend列中的列表元素 df_exploded = df_initial.explode('trend', ignore_index=True) # 将trend列的字典拆分为独立列,和keyword列合并 df_final = pd.concat([ df_exploded[['keyword']], pd.json_normalize(df_exploded['trend']) ], axis=1) # 可选:将month转为小写 df_final['month'] = df_final['month'].str.lower() print(df_final)
两种方法都能生成你需要的DataFrame结构,方法二的代码更简洁,处理大量数据时效率更高。
内容的提问来源于stack exchange,提问作者Jahrakal
相关产品推荐
相关产品推荐

