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

如何更简洁地基于DATE和symbol从df1向df2提取对应值?

解决方案

针对你的需求,这里有几种比melt+merge更简洁高效的实现方式,适合处理大量DataFrame:

方法1:使用DataFrame.lookup(推荐,性能最优)

lookup是Pandas专门为行列匹配取值设计的方法,直接根据两组标签(行标签和列标签)提取对应位置的值,无需转换数据结构,效率极高。

示例代码:

import pandas as pd

# 示例数据
df1 = pd.DataFrame({
    'DATE': ['2006-10-31', '2006-11-30', '2006-12-28'],
    'a': [100, 10, 50],
    'b': [200, 400, 5],
    'c': [300, 5, 90]
})
df2 = pd.DataFrame({
    'DATE': ['2006-10-31', '2006-11-30', '2006-12-28'],
    'symbol': ['a', 'b', 'c']
})

# 提取值并赋值给df2
df2['desired output'] = df1.set_index('DATE').lookup(df2['DATE'], df2['symbol'])

执行后df2的结果:

DATE symbol  desired output
0  2006-10-31      a             100
1  2006-11-30      b             400
2  2006-12-28      c              90

方法2:使用DataFrame.loc结合索引

将df1的DATE设为索引后,利用loc按行(DATE)和列(symbol)取值,适合需要更灵活操作的场景:

df1_indexed = df1.set_index('DATE')
df2['desired output'] = [df1_indexed.loc[date, sym] for date, sym in zip(df2['DATE'], df2['symbol'])]

注意:这种方法本质是循环,数据量极大时性能略逊于lookup,但代码直观易懂。

方法3:使用merge的优化写法(避免显式melt)

如果习惯用merge,可以通过melt的链式调用简化代码,减少中间变量:

df2 = df2.merge(
    df1.melt(id_vars='DATE', var_name='symbol', value_name='desired output'),
    on=['DATE', 'symbol'],
    how='left'
)

这种写法比分步melt+merge更简洁,但性能和分步操作一致,适合对merge逻辑更熟悉的用户。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:25:18