如何无需循环高效按指定行列对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
相关产品推荐
相关产品推荐

