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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:06:24