在对角线以下的熊猫df中获取值

时间:2017-01-11 20:56:23

标签: python pandas

我有一个矩阵数据帧,我想得到对角线上后半部分的值(所以下面例子中的1下面的所有内容)。我希望结果是一个新的数据框,其中列出了所有这些值的列,但我不确定如何解决这个问题。

我的df缩短版:

Word    toxin    sloppy  grief
toxin   1       -0.03    -0.06
sloppy  -0.03    1       0.09
grief   -0.06    0.09    1

理想的df:

Column
-0.03
-0.06
0.09

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:5)

您可以使用Hugh来获取下三角形元素的索引。然后使用NumPy索引(例如values[np.tril_indices(...)])来获取数组中的那些值:

import numpy as np
import pandas as pd

df = pd.DataFrame({'Word': ['toxin', 'sloppy', 'grief'],
 'grief': [-0.059999999999999998, 0.089999999999999997, 1.0],
 'sloppy': [-0.029999999999999999, 1.0, 0.089999999999999997],
 'toxin': [1.0, -0.029999999999999999, -0.059999999999999998]})


values = df[df['Word']].values
lower_triangular = values[np.tril_indices(values.shape[0], -1)]
print(pd.DataFrame({'Column': lower_triangular})

产量

   Column
0   -0.03
1   -0.06
2    0.09

答案 1 :(得分:0)

<强> numpy.tril_indices
类似于@ unutbu的答案,但保留了多索引的索引

v = df.values
i, j = np.tril_indices_from(v, -1)
pd.Series(v[i, j], [df.index[i], df.columns[j]])

Word          
sloppy  toxin    -0.03
grief   toxin    -0.06
        sloppy    0.09
dtype: float64

numpy广播+ pandas mask + stack

rng = np.arange(len(df))
df.mask(rng[:, None] <= rng).stack()

Word          
sloppy  toxin    -0.03
grief   toxin    -0.06
        sloppy    0.09
dtype: float64