2017-01-11 10 views
1

私は行列のデータフレームを持っています。後半の値を対角線上に取得したいと考えています(下の例の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 

すべてのヘルプは非常に高く評価されます!

答えて

5

np.tril_indicesを使用して、下三角要素のインデックスを取得できます。次に、配列内のこれらの値を取得するために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 
0

numpy.tril_indices
@のunutbuの回答に似 が、マルチでインデックスを保存-index

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放送+ pandasmask + 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