如何提取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
相关产品推荐
相关产品推荐

