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

Pandas:如何用一个表的列值作为索引提取另一表对应数据?

嘿,我太懂这种「看起来简单实际踩坑」的感觉了!这就给你几个靠谱的解决方案,帮你把df2里对应ticker和hhmm的数值匹配到df1中,最终得到包含ticker、hhmm、df2val三列的结果。

解决方案

方法1:用apply逐行匹配(直观易懂,适合小数据集)

这个方法逻辑最直白,对df1的每一行,根据ticker定位到df2的对应行,再根据hhmm的取值作为列名,取出对应的值:

import pandas as pd

# 假设你的df1和df2已经初始化完成
def fetch_value(row):
    # 筛选df2中ticker匹配的行,再提取hhmm指定列的数值
    return df2[df2['ticker'] == row['ticker']][row['hhmm']].values[0]

# 新增df2val列
df1['df2val'] = df1.apply(fetch_value, axis=1)

⚠️ 注意:如果你的数据集规模很大,apply的逐行处理速度会比较慢,这时候推荐用下面的方法。

方法2:将df2转为长格式后合并(高效,适合大数据集)

先把df2的宽格式(列名为0930、0931...)转成长格式,这样就能通过ticker和hhmm两个字段和df1做关联合并,这个方法用的是pandas的向量化操作,速度快很多:

# 把df2转成长格式:保留ticker,把原时间列转为hhmm字段,对应值转为df2val
df2_long = df2.melt(id_vars='ticker', var_name='hhmm', value_name='df2val')

# 通过ticker和hhmm做左连接,把df2val合并到df1中
df1 = df1.merge(df2_long, on=['ticker', 'hhmm'], how='left')

这个方法是处理这类宽转长匹配问题的标准做法,大数据量下优势明显。

方法3:用lookup直接匹配(简洁但注意版本兼容)

pandas的lookup方法可以直接根据行索引和列名匹配对应值,不过要注意:pandas 1.2.0之后lookup被标记为过时,但目前仍可使用;如果想用更兼容的写法,可以用替代方案:

# 先把df2的索引设为ticker,方便按ticker定位行
df2.set_index('ticker', inplace=True)

# 方法A:用lookup(过时但可用)
df1['df2val'] = df2.lookup(df1['ticker'], df1['hhmm'])

# 方法B:替代lookup的兼容写法(推荐)
df1['df2val'] = df2.reindex(df1['ticker']).to_numpy()[range(len(df1)), df2.columns.get_indexer(df1['hhmm'])]

完成以上任意一种操作后,df1就会新增df2val列,包含你需要的对应数值啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:33:58