pandas:获取DataFrame中对角线以下的元素(索引,列)
我有一个叫做 df 的 pandas 数据框。
我想提取出一个列表,里面包含 df 中所有 (列, 行) 的位置,前提是这个位置的值大于 0.95。
另外,我还想要确保这些位置是在 df 的下三角区域,也就是不包括对角线本身。(如果有帮助的话,这个数据框是一个相关性数据框,所以对角线上的值都是 1,这不是我想要的。)
我该怎么做呢?
2 个回答
9
有几种方法可以使用 df.mask
来隐藏上三角部分的值。
一种方法是使用 np.triu
。这个方法会把数组右下角的值设置为零。下面是一个例子:
>>> df = pd.DataFrame({'a': [3]*5, 'b': [2]*5, 'c': [1]*5, 'd': [0]*5, 'e': [6]*5})
>>> df
a b c d e
0 3 2 1 0 6
1 3 2 1 0 6
2 3 2 1 0 6
3 3 2 1 0 6
4 3 2 1 0 6
>>> df.mask(np.triu(np.ones(df.shape, dtype=np.bool_)))
a b c d e
0 NaN NaN NaN NaN NaN
1 3 NaN NaN NaN NaN
2 3 2 NaN NaN NaN
3 3 2 1 NaN NaN
4 3 2 1 0 NaN
下面的表达式也会产生相同的 DataFrame:
df.mask(np.arange(df.shape[0]) >= np.arange(df.shape[1])[:, np.newaxis])
然后你可以像往常一样查询这个新的 DataFrame。例如:
>>> dfm = df.mask(np.triu(np.ones(df.shape, dtype=np.bool_)))
>>> dfm[dfm > 1]
a b c d e
0 NaN NaN NaN NaN NaN
1 3 NaN NaN NaN NaN
2 3 2 NaN NaN NaN
3 3 2 NaN NaN NaN
4 3 2 NaN NaN NaN
如果你想获取你想要的值的索引列表,这里有一个选项:
>>> a = dfm[dfm > 1]
>>> np.stack(a.notnull().values.nonzero()).T.tolist()
[[1, 0], [2, 0], [2, 1], [3, 0], [3, 1], [4, 0], [4, 1]]
10
In [71]: df = DataFrame(np.arange(25).reshape(5,5))
In [72]: df
Out[72]:
0 1 2 3 4
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
这段代码会遮住上三角部分(包括对角线)
In [73]: mask = np.ones(df.shape,dtype='bool')
In [74]: mask[np.triu_indices(len(df))] = False
In [75]: mask
Out[75]:
array([[False, False, False, False, False],
[ True, False, False, False, False],
[ True, True, False, False, False],
[ True, True, True, False, False],
[ True, True, True, True, False]], dtype=bool)
模拟你的条件(大于0.95)
In [76]: df>16
Out[76]:
0 1 2 3 4
0 False False False False False
1 False False False False False
2 False False False False False
3 False False True True True
4 True True True True True
这可能是你想要的结果形式
In [77]: df[(df>16)&mask]
Out[77]:
0 1 2 3 4
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN 17 NaN NaN
4 20 21 22 23 NaN
如果你真的想要位置的值
In [78]: x = ((df>16)&mask).values.nonzero()
In [79]: zip(x[0],x[1])
Out[79]: [(3, 2), (4, 0), (4, 1), (4, 2), (4, 3)]