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

如何为从Outlook邮件提取的非全量Ticker的DataFrame匹配对应Pkey列

解决DataFrame添加Pkey列时长度不匹配的问题

你的问题核心在于直接给df['Pkey']赋值固定长度的列表——这种方式只有当DataFrame的行数和列表长度完全一致时才有效。当邮件里只返回部分Ticker时,行数变少,自然会抛出长度不匹配的错误。

正确的做法是建立Ticker与Pkey的映射关系,然后根据DataFrame中实际存在的Ticker去匹配对应的Pkey,这样不管有多少个Ticker都能正常赋值。

修改步骤:

  1. 把原来的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()。

  1. 替换原来的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:22:36