Подтвердить что ты не робот

Расплавьте верхнюю треугольную матрицу Pandas Dataframe

Учитывая квадрат pandas DataFrame следующего вида:

   a  b  c
a  1 .5 .3
b .5  1 .4
c .3 .4  1

Как я могу melt видеть только верхний треугольник, чтобы получить

 Row     Column    Value
  a        a       1
  a        b       .5 
  a        c       .3
  b        b       1
  b        c       .4
  c        c       1 

#Note the combination a,b is only listed once.  There is no b,a listing     

Меня больше интересует идиоматическое решение pandas, пользовательский индексатор будет достаточно лёгким для записи вручную... Спасибо за ваше внимание и ответ.

4b9b3361

Ответ 1

Сначала я преобразую более низкие значения df в NaN в where и numpy.triu, а затем stack, reset_index и укажите имена столбцов:

import numpy as np

print df
     a    b    c
a  1.0  0.5  0.3
b  0.5  1.0  0.4
c  0.3  0.4  1.0

print np.triu(np.ones(df.shape)).astype(np.bool)
[[ True  True  True]
 [False  True  True]
 [False False  True]]

df = df.where(np.triu(np.ones(df.shape)).astype(np.bool))
print df
    a    b    c
a   1  0.5  0.3
b NaN  1.0  0.4
c NaN  NaN  1.0

df = df.stack().reset_index()
df.columns = ['Row','Column','Value']
print df

  Row Column  Value
0   a      a    1.0
1   a      b    0.5
2   a      c    0.3
3   b      b    1.0
4   b      c    0.4
5   c      c    1.0

Ответ 2

Основываясь на решении @jezrael, булевская индексация будет более явным образом:

import numpy
from pandas import DataFrame

df = DataFrame({'a':[1,.5,.3],'b':[.5,1,.4],'c':[.3,.4,1]},index=list('abc'))
print df,'\n'
keep = np.triu(np.ones(df.shape)).astype('bool').reshape(df.size)
print df.stack()[keep]

выход:

     a    b    c
a  1.0  0.5  0.3
b  0.5  1.0  0.4
c  0.3  0.4  1.0 

a  a    1.0
   b    0.5
   c    0.3
b  b    1.0
   c    0.4
c  c    1.0
dtype: float64