如何用向量化方法从DataFrame中按Numpy数组提取HHt列值(无需循环)
问题:如何用向量化方法替代循环提取DataFrame指定索引的HHt列值?
给定如下numpy数组,能否不使用for循环,而是通过向量化方法返回DataFrame中HHt列的对应值?
示例数组:
ex_arr = [2643, 2644, 2647]
原循环实现代码:
for i in ex_arr: h_p = df.at[i, "HHt"]
示例DataFrame:
| 索引 | HHt |
|---|---|
| 2643 | 1 |
| 2644 | 2 |
| 2645 | 3 |
| 2646 | 4 |
| 2647 | 5 |
| 2648 | 6 |
| 2649 | 7 |
| 2650 | 8 |
预期结果:输出 1、2、5 对应的值。
解决方案
完全可以用向量化操作替代循环,以下是几种高效的实现方式:
方法1:使用df.loc[]索引(最直接)
loc支持直接传入索引数组批量提取指定行的指定列,是Pandas中最常用的向量化索引方式:
# 提取对应索引的HHt列值 h_p = df.loc[ex_arr, "HHt"] # 若需要纯值数组(对应循环逐个取出的结果) values = h_p.values # 输出 array([1, 2, 5]) # 或转为列表 values_list = h_p.tolist() # 输出 [1, 2, 5]
运行后h_p会返回一个Series:
索引 2643 1 2644 2 2647 5 Name: HHt, dtype: int64
方法2:使用df.reindex()
通过reindex重新对齐DataFrame索引,再提取HHt列:
h_p = df.reindex(ex_arr)["HHt"]
效果和loc一致,适合需要先对齐索引再取值的场景。
方法3:使用Series.take()结合索引位置
先获取目标索引在DataFrame索引中的位置,再用take批量取值:
# 获取目标索引对应的位置索引 pos_indices = df.index.get_indexer(ex_arr) # 提取HHt列对应位置的值 h_p = df["HHt"].take(pos_indices)
这种方式适合需要基于位置而非索引标签操作的场景。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

