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

网页爬取后如何展开DataFrame的perfCalendaire列?

问题:将DataFrame中perfCalendaire列展开为年份命名的独立列

用户爬取网页后得到的DataFrame中,perfCalendaire列是包含年份和对应收益率的字典列表,需要将其展开为以年份(如2015、2016)为列名的独立列。

爬取代码

import requests
import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
import json

url = 'https://www.quantalys.com/Categories'
soup = BeautifulSoup(requests.get(url).content, "html.parser")

data = soup.select_one("#DataCatsWithPerfs")["value"]
data = json.loads(data)

df = pd.DataFrame(data)

当前perfCalendaire列输出示例

dtRetMonth  perfCalendaire
0   2023-07-01  [{'nYear': 2015, 'nRet': 0.1204}, {'nYear': 20...
1   2023-07-01  [{'nYear': 2015, 'nRet': 0.143}, {'nYear': 201...
2   2023-07-01  [{'nYear': 2015, 'nRet': 0.2041}, {'nYear': 20...
3   2023-07-01  [{'nYear': 2015, 'nRet': 0.0155}, {'nYear': 20...
4   2023-07-01  [{'nYear': 2015, 'nRet': -0.1601}, {'nYear': 2...

解决方案

可以通过apply将每个字典列表转换为小DataFrame,再合并到原DataFrame,调整列名后得到目标结果:

# 将perfCalendaire列的每个元素转为以年份为索引的Series,再展开为列
expanded_df = df['perfCalendaire'].apply(
    lambda x: pd.DataFrame(x).set_index('nYear')['nRet']
).unstack()

# 将年份索引转为字符串作为列名
expanded_df.columns = expanded_df.columns.get_level_values(0).astype(str)

# 合并原数据与展开后的数据,删除原perfCalendaire列
final_df = pd.concat([df.drop('perfCalendaire', axis=1), expanded_df], axis=1)

# 查看最终结果
print(final_df)

代码说明

  1. 展开嵌套数据:遍历perfCalendaire的每个元素,把字典列表转为以nYear为索引、nRet为值的Series,再用unstack()将索引转为列。
  2. 调整列名:把年份索引转为字符串格式,确保列名显示为"2015"、"2016"这类直观名称。
  3. 合并数据:去掉原DataFrame中的perfCalendaire列,和展开后的DataFrame按列合并,得到结构规整的最终数据。

内容的提问来源于stack exchange,提问作者Jacques

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 06:04:56