如何从Pandas DataFrame中提取特定值对应的行索引和列名
解决方案
你已经得到了布尔值掩码,后续可以通过numpy的矢量化操作快速提取所有匹配位置,完全不需要遍历循环,适配超大规模DataFrame的查询需求。
方法1:np.where 实现(性能最优,推荐大表使用)
import pandas as pd import numpy as np # 测试数据构建 df_dict = { 'header0' : [55,12,13,14,15], 'header1' : [21,22,23,24,25], 'header2' : [31,32,55,34,35], 'header3' : [41,42,43,44,45], 'header4' : [51,52,53,54,33] } index_list = { 0:'index0', 1:'index1', 2:'index2', 3:'index3', 4:'index4' } df = pd.DataFrame(df_dict).rename(index = index_list) # 核心查询函数 def find_all_positions(df, target): # 生成布尔掩码 mask = df == target # 提取匹配位置的行、列序号数组 row_idx, col_idx = np.where(mask) # 转换为实际的行索引名和列名,返回元组列表 return [(df.index[r], df.columns[c]) for r, c in zip(row_idx, col_idx)]
调用测试:
print(find_all_positions(df, 55))
输出结果:
[('index0', 'header0'), ('index2', 'header2')]
如果需要分别返回行索引列表和列名列表,可修改函数如下:
def find_all_positions_split(df, target): mask = df == target row_idx, col_idx = np.where(mask) return df.index[row_idx].tolist(), df.columns[col_idx].tolist() # 调用示例 rows, cols = find_all_positions_split(df, 55) print(rows) # ['index0', 'index2'] print(cols) # ['header0', 'header2']
方法2:stack 实现(写法最简洁,适合中小表使用)
一行代码即可完成查询:
result = df[df == 55].stack().index.tolist() print(result) # 输出:[('index0', 'header0'), ('index2', 'header2')]
方案优势
- 两种方法均为矢量化操作,性能远高于手动循环遍历,百万级行的大表也可以在毫秒级完成查询
- 自动返回所有重复值的匹配位置,不存在只返回第一个结果的问题
- 支持任意可比较类型的查询值,int、float、str等类型均适配
- 无匹配值时会自动返回空列表,无需额外处理异常
内容的提问来源于stack exchange,提问作者Christopher Denq
相关产品推荐
相关产品推荐

