堆叠一个方形DataFrame以仅保留上/下三角形

问题描述 投票:0回答:3

我在

DataFrame
中有一个对称的正方形
pandas

a = np.random.rand(3, 3)
a = (a + a.T)/2
np.fill_diagonal(a, 1.)
a = pd.DataFrame(a)

看起来像这样:

          0         1         2
0  1.000000  0.747064  0.357616
1  0.747064  1.000000  0.631622
2  0.357616  0.631622  1.000000

如果我应用

stack
方法,我会得到很多冗余信息(包括对角线,我对此不感兴趣):

0  0    1.000000
   1    0.747064
   2    0.357616
1  0    0.747064
   1    1.000000
   2    0.631622
2  0    0.357616
   1    0.631622
   2    1.000000

有没有办法只使用“纯”来获得下(或上)三角形

pandas

1  0    0.747064
2  0    0.357616
   1    0.631622
python pandas numpy
3个回答
8
投票

你可以使用

mask

In [278]: a.mask(np.triu(np.ones(a.shape)).astype(bool)).stack()
Out[278]:
1  0    0.747064
2  0    0.357616
   1    0.631622
dtype: float64

或使用

where

In [285]: a.where(np.tril(np.ones(a.shape), -1).astype(bool)).stack()
Out[285]:
1  0    0.747064
2  0    0.357616
   1    0.631622
dtype: float64

6
投票

我能想到的最简单的方法是强制上(或下)三角形为 NaN,因为默认情况下

stack
方法不会包含 NaN:

a.values[np.triu_indices_from(a, 0)] = np.nan
a.stack()

给出:

1  0    0.747064
2  0    0.357616
   1    0.631622

0
投票
import numpy as np
import pandas as pd

data = {
    0: [100, 200, 300],
    1: [400, 500, 600],
    2: [700, 800, 1000]
}

a = pd.DataFrame(data)

# Create a mask for the upper triangle
mask = np.triu(np.ones_like(a, dtype=bool), k=1)
'''
[[False  True  True]
 [False False  True]
 [False False False]]
'''
a = a.where(mask).stack()
print(a)
'''
0  1    400.0
   2    700.0
1  2    800.0
dtype: float64
'''
© www.soinside.com 2019 - 2024. All rights reserved.