我在
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
你可以使用
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
我能想到的最简单的方法是强制上(或下)三角形为 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
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
'''