网页爬取后如何展开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)
代码说明
- 展开嵌套数据:遍历
perfCalendaire的每个元素,把字典列表转为以nYear为索引、nRet为值的Series,再用unstack()将索引转为列。 - 调整列名:把年份索引转为字符串格式,确保列名显示为"2015"、"2016"这类直观名称。
- 合并数据:去掉原DataFrame中的
perfCalendaire列,和展开后的DataFrame按列合并,得到结构规整的最终数据。
内容的提问来源于stack exchange,提问作者Jacques
相关产品推荐
相关产品推荐

