You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套字典中的趋势数据展开并转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:25:30