如何为从Outlook邮件提取的非全量Ticker的DataFrame匹配对应Pkey列
解决DataFrame添加Pkey列时长度不匹配的问题
你的问题核心在于直接给df['Pkey']赋值固定长度的列表——这种方式只有当DataFrame的行数和列表长度完全一致时才有效。当邮件里只返回部分Ticker时,行数变少,自然会抛出长度不匹配的错误。
正确的做法是建立Ticker与Pkey的映射关系,然后根据DataFrame中实际存在的Ticker去匹配对应的Pkey,这样不管有多少个Ticker都能正常赋值。
修改步骤:
- 把原来的Pkey列表改成字典,键是Ticker的具体值,值是对应的Pkey。你需要把每个Ticker和对应的Pkey一一对应写清楚:
# 替换原来的Pkey列表,这里要填入你实际的Ticker值 pkey_mapping = { 'TICKER1': 71763307, 'TICKER2': 76366654, 'TICKER3': 137292386, 'TICKER4': 151971418, 'TICKER5': 151971419, 'TICKER6': 152547427, 'TICKER7': 152547246 }
注意:这里的Ticker值要和HTML表格里的Ticker列内容完全一致(包括大小写、空格等),否则会匹配不到,返回
NaN。如果有格式不一致的情况,可以先对Ticker列做清洗,比如df['Ticker'] = df['Ticker'].str.strip().str.upper()。
- 替换原来的
df['Pkey'] = Pkey,改成用映射来赋值:
df['Pkey'] = df['Ticker'].map(pkey_mapping)
修改后的完整代码:
import pandas as pd import win32com.client from sqlalchemy.engine import create_engine import re from datetime import datetime, timedelta import requests import sys from bs4 import BeautifulSoup from pprint import pprint EMAIL_ACCOUNT = 'robinhood.gmail.com' EMAIL_SUBJ_SEARCH_STRING = 'Morgan Stanley Systematic Strategies Daily Levels' out_app = win32com.client.gencache.EnsureDispatch("Outlook.Application") out_namespace = out_app.GetNamespace("MAPI") root_folder = out_namespace.GetDefaultFolder(6) out_iter_folder = root_folder.Folders['Email_Snapper'] item_count = out_iter_folder.Items.Count Flag = False cnt = 1 if item_count > 0: for i in range(item_count, 0, -1): message = out_iter_folder.Items[i] if EMAIL_SUBJ_SEARCH_STRING in message.Subject and cnt <=1: cnt=cnt+1 Body_content = message.HTMLBody Body_content = BeautifulSoup(Body_content,"lxml") html_tables = Body_content.find_all('table')[0] #Body_content = Body_content[:Body_content.find("Disclaimer")].strip() df = pd.read_html(str(html_tables),header=0)[0] # 关键修改:用映射字典替代固定列表 pkey_mapping = { # 这里请替换成你实际的Ticker值 'TICKER_A': 71763307, 'TICKER_B': 76366654, 'TICKER_C': 137292386, 'TICKER_D': 151971418, 'TICKER_E': 151971419, 'TICKER_F': 152547427, 'TICKER_G': 152547246 } # 根据Ticker匹配对应的Pkey df['Pkey'] = df['Ticker'].map(pkey_mapping) print(df)
额外说明:
- 如果遇到某个Ticker不在映射字典里,
map方法会返回NaN,你可以根据需求处理这些值,比如用df['Pkey'] = df['Ticker'].map(pkey_mapping).fillna(0)填充为0,或者过滤掉这些行。 - 确保Ticker的拼写完全一致是关键,如果邮件里的Ticker有格式变化(比如带空格、大小写混合),可以先对
df['Ticker']做清洗处理,避免匹配失败。
内容的提问来源于stack exchange,提问作者Rahul Vaidya
相关产品推荐
相关产品推荐

