基于行内指定值获取Pandas DataFrame的(index, column)对
解决方法:从DataFrame中提取值为指定内容的(index, column)配对
我明白你的需求了——你需要找出DataFrame中所有值等于目标值(比如示例中的"a")的位置,将对应的行索引和列名组成唯一的配对列表对吧?之前你尝试分开获取符合条件的列和索引,但没法正确组合,下面给你两种简单有效的方法:
方法1:使用stack()方法(简洁直观)
首先我们先创建你的示例DataFrame方便演示:
import pandas as pd data = { 'A': ['a', 'c', 'b'], 'B': ['a', 'b', 'a'], 'C': ['c', 'a', 'c'], 'D': ['c', 'a', 'a'] } df = pd.DataFrame(data, index=[1,2,3])
然后执行以下代码提取目标配对:
target_value = "a" # 筛选出值为target_value的元素,stack后保留非空项,最后提取索引配对 result = [(idx, col) for idx, col in df[df == target_value].stack().index]
原理说明:
df == target_value生成一个布尔矩阵,标记出所有等于目标值的位置df[df == target_value]会将不符合条件的位置转为NaNstack()会将列标签转换为行索引的一部分,同时自动剔除包含NaN的行- 最终的
stack()结果的索引就是(行索引, 列名)的配对,直接转成列表即可
方法2:使用numpy的where方法(高效灵活)
如果你需要更底层的操作,可以用numpy来定位符合条件的位置:
import numpy as np target_value = "a" # 获取所有值等于target_value的位置的整数索引 rows, cols = np.where(df == target_value) # 将整数索引映射为实际的行标签和列名,组成配对列表 result = [(df.index[row], df.columns[col]) for row, col in zip(rows, cols)]
原理说明:
np.where(df == target_value)返回两个数组,分别是符合条件的元素的行、列整数位置- 通过
df.index[row]和df.columns[col]将整数位置转换为你实际使用的行标签和列名 - 最后用
zip把行和列的位置配对,生成目标列表
验证结果
两种方法执行后,都会得到你期望的结果:
[(1, 'A'), (1, 'B'), (2, 'C'), (2, 'D'), (3, 'B'), (3, 'D')]
之前你尝试的方法之所以无法得到正确结果,是因为req_cols只是包含至少一个目标值的列,req_inds是整个DataFrame的索引,这两个集合无法直接对应到具体的位置配对,而上面的两种方法都是直接定位到每个符合条件的元素的精确位置,自然能得到唯一的配对。
内容的提问来源于stack exchange,提问作者Amith Adiraju
相关产品推荐
相关产品推荐

