You need to enable JavaScript to run this app. Python Pandas 如何基于两张DataFrame按列名匹配高效生成行业因子股票十分位结果表
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas 如何基于两张DataFrame按列名匹配高效生成行业因子股票十分位结果表

高效实现行业因子十分位匹配的技术方案

基础数据结构对齐

首先明确两张基础表的标准轴定义,避免轴错位导致的逻辑错误:

  • zongmok:行业因子十分位结果表,行索引为时间截面日期,列索引为单个行业标识,单元格值为对应时间下该行业因子计算得出的十分位分组值(取值1-10)
  • inds:股票行业属性表,行索引为股票代码,列索引为时间截面日期,单元格值为对应时间下该股票归属的行业标识
  • 目标产出df:结构与inds完全对齐,行索引为股票代码,列索引为时间截面日期,单元格值为对应时间下,该股票所属行业在zongmok中对应的十分位分组结果

原实现效率瓶颈说明

原双层嵌套循环运行缓慢,核心原因有三点:

  • 逐单元格触发.loc索引操作,每次索引都会触发pandas的链式校验、切片逻辑,单单元格操作的耗时是批量向量化操作的上千倍
  • 循环内部嵌套了dropna、布尔筛选的重复计算,每遍历一个单元格就重新执行一次全表筛选,没有复用中间计算结果
  • 完全没有利用pandas的轴对齐、广播匹配能力,整体退化为Python原生循环的运行速度

可直接落地的高效实现路径

方案一:全向量化长表匹配(运行速度最快)

全流程不涉及逐行/逐单元格的循环,完全利用pandas的批量数据处理能力,在常规投研数据规模下(5000只股票、2000个交易日、30个行业分类)全流程运行耗时通常在1秒以内。

# 步骤1:将zongmok宽表转为长表,统一匹配字段并重命名
zongmok_long = zongmok.stack().rename("decile_group").reset_index()
zongmok_long.columns = ["trade_date", "industry", "decile_group"]

# 步骤2:将inds宽表转为长表,统一匹配字段并重命名
inds_long = inds.stack().rename("industry").reset_index()
inds_long.columns = ["stock_code", "trade_date", "industry"]

# 步骤3:基于「交易日期+行业标识」双主键左连接,自动完成分组值匹配,无匹配值自动留空
merged_long = inds_long.merge(
    zongmok_long,
    on=["trade_date", "industry"],
    how="left"
)

# 步骤4:将合并后的长表转回和inds结构完全一致的宽表
df = merged_long.pivot(
    index="stock_code",
    columns="trade_date",
    values="decile_group"
)

方案二:单截面向量化映射(实现逻辑更直观)

如果不想做宽长表转换,可以仅在交易日维度做单层循环,每次循环完成整列的批量映射,运行速度同样远高于双层循环,代码更易调试。

# 初始化目标df结构
df = pd.DataFrame(index=inds.index, columns=inds.columns, dtype=float)
# 仅遍历每一个交易日,无逐股票的嵌套循环
for trade_date in inds.columns:
    # 取出当前日期下所有股票的所属行业列表
    stock_industry_series = inds[trade_date]
    # 取出当前日期下,各行业对应的十分位分组值(行业为索引的Series)
    industry_decile_series = zongmok.loc[trade_date]
    # 用map完成整列批量映射,无单元格级操作
    df[trade_date] = stock_industry_series.map(industry_decile_series)

注意:上述两种方案均会自动处理行业/时间匹配不上的场景,匹配失败的单元格自动赋值为NaN,完全可以替代原代码中try/except的异常捕获逻辑,不会出现索引报错中断的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 23:06:04