无法为从HTML解析的已有DataFrame映射新增列的原因咨询
无法为HTML表格解析的DataFrame添加新列的原因分析
问题背景
我们有一项SES服务,将Outlook邮件以HTML格式存储并可通过API链接访问。目前通过Python提取邮件关键信息,已成功将API返回的HTML表格存入DataFrame,但无法为该DataFrame添加新列。
相关代码
import json from urllib.request import urlopen from operator import itemgetter import pandas as pd import requests import re from datetime import datetime, timedelta with urlopen('https://pv-ft-marketdata-store.ihsmvals-dev.com/email/search?asof=2022-07-20') as resp: json_data = json.load(resp) json_data.sort(key=itemgetter("processed"), reverse=True) for i in range(0,len(json_data)): if re.findall("Morgan Stanley Systematic Strategies Daily Level",json_data[i]["subject"]): key = json_data[i]["key"] subject = json_data[i]["subject"] Date = re.findall(r'\d{4}-\d{2}-\d{2}',json_data[i]["subject"]) print(subject) print(key) print(Date) #("Morgan Stanley Systematic Strategies Daily Level")) URL = "https://pv-ft-marketdata-store.ihsmvals-dev.com/email/" + key + "/data/html" html = requests.get(URL).content df_list = pd.read_html(html) df = df_list[-1] Pkey = {'MSUSDSP5': 71763307, 'MSUSSPVP': 76366654,'MSCBICCO':137292386, 'MSCBWGSP':151971418, 'MSCBBGEC':151971419, 'MSUSEVHI':152547427, 'MSCBCTAD':152547426} df['Pkey'] = df['Ticker'].map(Pkey) print(df.head().to_dict())
相关截图说明
- 截图1:展示了解析后DataFrame的原有列结构,包含Ticker等字段
- 截图2:展示了尝试添加Pkey列后的结果,疑似新列未成功显示或值为空
可能的原因及解决方法
- Ticker值与Pkey字典键不匹配:检查DataFrame中Ticker列的实际值,是否和Pkey字典的键在大小写、空格、特殊字符上完全一致。比如Ticker列值为小写而字典键为大写,会导致映射失败,Pkey列全为NaN。解决:统一两者格式,或映射时做大小写转换(如
df['Ticker'].str.upper().map(Pkey))。 - 列名称存在格式问题:确认DataFrame的列名中确实有
Ticker,避免HTML解析后列名带有空格、换行或特殊字符(比如Ticker)。可以通过print(df.columns)查看所有列名,若存在格式问题,先重命名列(如df.rename(columns={' Ticker': 'Ticker'}, inplace=True))。 - DataFrame为视图而非副本:
pd.read_html返回的DataFrame可能是原数据的视图,添加列时会触发警告或失败。解决:先复制DataFrame,执行df = df.copy()后再添加列。 - 映射后全为NaN导致误判:若Ticker列的所有值都不在Pkey字典的键中,Pkey列会全是NaN,看起来像未添加成功。可以通过
print(df.columns)确认Pkey列是否存在,若存在则需要补充Pkey字典的键值对。
内容的提问来源于stack exchange,提问作者Rahul Vaidya
相关产品推荐
相关产品推荐

