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

如何无需循环高效按指定行列对DataFrame进行值提取?

高效提取DataFrame对应值的无循环实现方法

可以利用向量化操作替代嵌套循环,这类方法依赖numpy或pandas的底层优化,效率远高于循环,以下是几种可行方案:

示例数据准备

先构造两个示例DataFrame方便演示:

import pandas as pd
import numpy as np

# 源数据df_from
df_from = pd.DataFrame(
    {'A': [1,2,3,4], 'B': [5,6,7,8], 'C': [9,10,11,12]},
    index=['x','y','z','w']
)

# 路径映射df_path:索引对应df_from的行,值为需提取的列名
df_path = pd.DataFrame(
    {'col1': ['A', 'B', 'C', 'A'], 'col2': ['B', 'C', 'A', 'C']},
    index=['x','y','z','w']
)

方案1:numpy take_along_axis 向量化提取

利用numpy的轴对齐取值方法,直接对数组进行操作:

# 建立列名到列索引的映射
col_index_map = {col: idx for idx, col in enumerate(df_from.columns)}
# 将df_path的列名转换为对应索引
path_indices = df_path.applymap(lambda x: col_index_map[x])
# 提取对应值并转为DataFrame
result = pd.DataFrame(
    np.take_along_axis(df_from.values, path_indices.values, axis=1),
    index=df_path.index,
    columns=df_path.columns
)

方案2:pandas 扁平化索引取值

通过扁平化路径映射,结合索引匹配快速提取值:

# 扁平化路径后取值,再重塑为原形状
flat_values = df_from.lookup(
    df_path.index.repeat(df_path.shape[1]), 
    df_path.values.ravel()
)
result = pd.DataFrame(flat_values.reshape(df_path.shape), 
                      index=df_path.index, columns=df_path.columns)

方案3:堆叠索引映射取值

通过堆叠df_path的索引,利用pandas的索引对齐特性取值:

# 将df_path转为多级索引的Series
stacked_path = df_path.stack()
# 按索引匹配提取值,再恢复原结构
result = stacked_path.apply(lambda x: df_from.loc[stacked_path.index.get_level_values(0), x]).unstack()

这些方法都完全避免了嵌套循环,在数据量较大时,执行效率会比循环提升数倍甚至数十倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:10:36