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

如何提取DataFrame中多行出现元素的行索引与列名

提取DataFrame中特定值对应的行索引问题

问题场景

给定如下DataFrame,需要提取值为12的元素对应的列名和行索引:

import numpy as np
import pandas as pd
import random
lst = list(range(30))
segments = np.repeat(lst, 3)
random.shuffle(segments)
segments = segments.reshape(10, 9)
col_names = ['lz'+str(i) for i in range(95,104)]
rows_names = ['con'+str(i) for i in range(0,10)]
df = pd.DataFrame(segments, index=rows_names, columns=col_names)

生成的DataFrame:

lz95  lz96  lz97  lz98  lz99  lz100  lz101  lz102  lz103
con0     6     9    11     7     9     24     18     10      1
con1    24     5    21    15    18     25     24      7     29
con2    17    27     2     0    11     11     18     23      0
con3    16    22    20    22    20     14     14      0      8
con4    10    10     3    13    25     14      9     17     16
con5     3    28    22     2    27     12     16     21      4
con6    26     1    19     7    19      6     29     15     26
con7    26    28     4    13    23     23      1     25     19
con8    28     8     3     6     5      8      4      5     29
con9     2    15    21    27    17     13     12     12     20

提取列名时使用lz_val = df.columns[df.isin([12]).any()]可以成功得到目标列,但使用con_val = df[df==12].index会返回所有行索引,无法得到正确结果。

问题原因

df[df==12]会生成一个与原DataFrame结构完全一致的新DataFrame——仅将匹配12的位置保留原值,其余位置填充NaN。由于新DataFrame仍保留所有行的索引结构,直接取.index会返回全部行索引,而非仅包含目标值的行。

解决方案

方法1:基于行维度的存在性判断

使用isin([12])标记所有匹配位置,再通过any(axis=1)判断每行是否存在目标值,最后筛选对应的行索引:

con_val = df.index[df.isin([12]).any(axis=1)]

执行结果:Index(['con5', 'con9'], dtype='object')

方法2:堆叠DataFrame后筛选

将DataFrame堆叠为Series(保留行和列的多层索引),筛选值为12的条目后提取行索引并去重:

stacked = df.stack()
con_val = stacked[stacked == 12].index.get_level_values(0).unique()

执行结果同样为Index(['con5', 'con9'], dtype='object')

内容的提问来源于stack exchange,提问作者Noura

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:40:19