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

基于DataFrame值索引:重叠日期索引的Pandas DataFrame操作问询

解决基于df2列名索引df1对应数值的问题

看起来你想要实现的是:利用df2中每个单元格的列名字符串,从df1的对应日期行中取出该列的数值,生成一个和df2结构一致的结果DataFrame对吧?下面是几种可行的实现方式:

方法1:使用lookup(适用于Pandas旧版本,注意新版本已标记为弃用)

lookup方法可以直接根据行索引和列标签的数组来提取对应的值,非常贴合这个场景:

import pandas as pd
import numpy as np

# 初始化你的数据(补充df2的a/b/c/d为字符串列名)
a, b, c, d = 'a', 'b', 'c', 'd'
df1 = pd.DataFrame(np.random.randn(5,4), index=pd.date_range('01/02/2014',periods=5,freq='D'), columns=['a','b','c', 'd'] )
df2 = pd.DataFrame({0 : [a,b,c,d], 1 : [b,c,b,a], 2 : [c,d,a,b], 3 : [d,a,d,c]},index=pd.date_range('01/03/2014',periods=4,freq='D'))

# 提取对应值并构建结果DataFrame
result = pd.DataFrame(
    df1.lookup(df2.index, df2.values.ravel()),
    index=df2.index,
    columns=df2.columns
).values.reshape(df2.shape)

方法2:使用stack + 索引匹配(推荐,兼容新版本Pandas)

如果你的Pandas版本已经移除了lookup支持,这种更灵活的方式可以替代:

# 把df1转换为长格式,索引为「日期+列名」的组合
df1_long = df1.stack().rename('value')

# 将df2转换为长格式,对齐df1_long的索引结构
df2_long = df2.stack().rename('col')
df2_long = df2_long.reset_index().set_index(['level_0', 'col'])

# 合并提取值后转回宽格式,保持df2的结构
result = df2_long.join(df1_long).unstack('level_1')
result.columns = df2.columns

方法3:使用Numpy索引(高效简洁)

借助Numpy的广播索引特性,直接定位取值:

# 获取df2索引在df1中的位置
row_indices = df1.index.get_indexer(df2.index)
# 构建df1列名到位置的映射
col_map = {col: idx for idx, col in enumerate(df1.columns)}
col_indices = np.vectorize(col_map.get)(df2.values)

# 提取数值并生成结果DataFrame
result = pd.DataFrame(
    df1.values[row_indices, col_indices],
    index=df2.index,
    columns=df2.columns
)

注意事项

  • 请确保df2中的所有元素都是df1的有效列名,否则会触发索引错误,你可以提前用df2.isin(df1.columns).all().all()验证有效性
  • 两个DataFrame只有重叠的日期索引会被处理,比如df1的2014-01-02在df2中没有对应项,不会出现在结果里

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:14:54