如何使用Pandas批量查找多行多列对应值?
问题描述
我是Python新手,有如下存储为DataFrame的表格:
| Age | 2000 | 2010 | 2020 |
|---|---|---|---|
| 20 | 0.5 | 0.6 | 0.7 |
| 21 | 0.4 | 0.4 | 0.8 |
| 22 | 0.3 | 0.2 | 0.5 |
现有两个列表:
a = [20, 20, 21, 22] b = [2000, 2010, 2010, 2020]
需要按[Age, 年份]的组合批量查找对应值,最终得到包含4个数值的数组。尝试过普通索引、多级索引,用.at和.loc时返回4×4表格,无法得到目标结果,求解决办法。
解决方案
方法1:用DataFrame.lookup(Pandas旧版适用)
lookup是专门按行-列对应组合取值的方法,直接传入行标签和列标签列表即可:
import pandas as pd # 构建你的DataFrame(确保Age是索引,年份列类型和b列表一致) df = pd.DataFrame( data=[[0.5, 0.6, 0.7], [0.4, 0.4, 0.8], [0.3, 0.2, 0.5]], index=[20, 21, 22], columns=[2000, 2010, 2020] ) a = [20, 20, 21, 22] b = [2000, 2010, 2010, 2020] result = df.lookup(a, b) print(result) # 输出: array([0.5, 0.6, 0.4, 0.5])
注意:如果你的年份列是字符串类型(比如列名是
'2000'),需要把b列表转成字符串格式。
方法2:转成多级索引Series后批量匹配
先将DataFrame堆叠成多级索引的Series,再用reindex匹配目标组合:
# 堆叠DataFrame,得到(index=Age, columns=年份)的多级索引Series stacked_series = df.stack() # 把a和b组合成元组列表 lookup_pairs = list(zip(a, b)) # 批量取值 result = stacked_series.reindex(lookup_pairs).values print(result) # 输出: array([0.5, 0.6, 0.4, 0.5])
方法3:Numpy向量化索引(高效)
将DataFrame转为Numpy数组,把行、列标签转换成位置索引后取值:
import numpy as np # 获取Age对应的行位置索引 row_pos = df.index.get_indexer(a) # 获取年份对应的列位置索引 col_pos = df.columns.get_indexer(b) # 用Numpy数组直接按位置取值 result = df.to_numpy()[row_pos, col_pos] print(result) # 输出: array([0.5, 0.6, 0.4, 0.5])
内容的提问来源于stack exchange,提问作者Cynthia
相关产品推荐
相关产品推荐

