2015-12-22 6 views
13

निम्न प्रपत्र का एक वर्ग पांडा DataFrame को देखते हुए:पिगलो के ऊपरी त्रिकोणीय मैट्रिक्स एक पांडा Dataframe

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

कैसे मैं केवल

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  

मैं पाने के लिए ऊपरी त्रिकोण melt कर सकते हैं और अधिक एक मुहावरेदार पांडा समाधान में रुचि रखते हैं, एक कस्टम इंडेक्सर काफी आसान हाथ से लिखने के लिए होगा ... आपके विचार और प्रतिक्रिया के लिए अग्रिम धन्यवाद।

उत्तर

18

सबसे पहले मैं where और numpy.triu और फिर stack, reset_index द्वारा NaN को df के निचले मूल्यों को बदलने और सेट स्तंभ नाम:

@jezrael द्वारा समाधान से
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

मैं बाहर देखने के लिए है के लिए अगर आप किसी भी 'NaN' मान ऊपरी त्रिकोण में संरक्षित करना चाहते हैं केवल एक चीज (' stack' उन सब को छोड़ देंगे)। आप स्पष्ट रूप से बहु सूचकांक का निर्माण करने के लिए और फिर पुन: अनुक्रमणिका यदि यह मामला है हो सकता है। –

4

भवन, बूलियन अनुक्रमण एक और अधिक स्पष्ट दृष्टिकोण होगा:

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 
संबंधित मुद्दे