如何从Pandas DataFrame按索引列坐标高效提取指定元素?
高效提取DataFrame指定坐标的元素
先给出示例数据:
import pandas as pd data = pd.DataFrame([[1,2,3],[21,23,24],[31,32,33]]) i = [0,1,2] # 与DataFrame的索引一致 y = [1,2,0]
问题描述
使用data.iloc[i, y]会得到一个3×3的DataFrame,但这并非所需结果。我需要提取对应坐标(0,1)、(1,2)、(2,0)的元素:2、24、31。目前使用的是iterrows循环或是data.apply(lambda x: x.iloc[y[int(x.name)]],axis=1).values这类方法,想请教:
- 循环或apply已是最快方案吗?
- 当拥有索引、列坐标的列表/Series/DataFrame时,是否存在更直接的方式提取单个元素而非切片?
更高效的解决方案
直接使用numpy的向量化索引或结合pandas的take方法,比循环和apply高效得多,尤其适合大型DataFrame:
方法1:转numpy数组后直接索引
将DataFrame转为numpy数组,利用数组的二维索引直接提取对应坐标的元素:
import numpy as np arr = data.to_numpy() result = arr[i, y] # 输出:array([ 2, 24, 31])
方法2:用np.ravel_multi_index生成扁平索引后提取
把二维坐标转换为一维扁平索引,再通过df.take提取元素:
flat_indices = np.ravel_multi_index((i, y), data.shape) result = data.take(flat_indices) # 输出结果为包含目标元素的Series,可通过.values转为数组
性能说明
- 循环和apply本质是Python层面的逐行处理,存在较大的循环开销,时间复杂度为O(n)
- 上述两种方法都是基于底层C实现的向量化操作,时间复杂度接近O(k)(k为要提取的元素个数),在处理大型DataFrame时,效率提升非常明显,行数越多,差距越显著。
内容的提问来源于stack exchange,提问作者user19838994
相关产品推荐
相关产品推荐

