如何在Python中检索与某个值匹配的矩阵中元素的行号和列号?

时间:2019-06-14 14:07:08

标签: python pandas numpy dataframe

问题实际上很简单,但是由于我是该语言的新手,所以我无法在Python中翻译它。

我有一个布尔值“ True”和“ False”的数据框,并且我需要一个false元素的坐标列表:

我需要对一系列矩阵进行此操作,这些矩阵会自动生成具有变化的行数和列数,但始终具有布尔值。

例如,我有一个像这样的矩阵:

    0       1       2
0   TRUE    FALSE   FALSE
1   TRUE    FALSE   TRUE
2   TRUE    TRUE    TRUE
3   FALSE   TRUE    TRUE
4   TRUE    TRUE    TRUE
5   TRUE    TRUE    TRUE
6   TRUE    TRUE    TRUE
7   TRUE    TRUE    TRUE
8   TRUE    TRUE    TRUE

我正在寻找一个像[[0,1),(0,2),(1,1),(3,0)]

的列表

我试图用pandas(因此请将矩阵视为“ pd.DataFrame”对象)和numpy解决此问题,但是我是该语言的新手,似乎无法理解函数的工作方式和使用方式他们。

2 个答案:

答案 0 :(得分:2)

您可以堆叠数据框并使用布尔索引:

t=df.stack()
t[~t].index.values

输出:

array([(0, 1), (0, 2), (1, 1), (3, 0)], dtype=object)

答案 1 :(得分:1)

方法1:

使用np.argwhere

np.argwhere(~df.values )

array([[0, 1],
       [0, 2],
       [1, 1],
       [3, 0]], dtype=int64)

方法2:

在@Scott Boston评论后编辑

为此,我们可以使用np.where,然后使用zip这两个数组来获得协调:

list(zip(*np.where(~df)))

[(0, 1), (0, 2), (1, 1), (3, 0)]

说明

np.where给我们两个数组,第一个是行索引,第二个是列索引。

np.where(~df)

(array([0, 0, 1, 3], dtype=int64), array([1, 2, 1, 0], dtype=int64))

因此,如果我们zip这些数组并将其转换为列表,则会得到所需的输出。