如何更简洁地基于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
相关产品推荐
相关产品推荐

