基于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
相关产品推荐
相关产品推荐

