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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:06:04