2015-12-03 74 views
1

我有一個數據集,我按項目分組(例如「小部件」),然後運行關聯。結果給出了每個小部件的矩陣,但是由於我有大量的矩陣,所以很難讀取任何導出的CSV。轉換熊貓關聯到列

是否有一種簡單的方法將矩陣轉換爲表示「列vs列」值的列?這進一步混淆了一些事實,即進入關聯的一些列絕對不相關。

我試過Pandas Correlation Groupby的答案,但它保留列作爲額外的索引(至少我認爲這是正確的術語,因爲我是熊貓新手)。

實例相關(與由數字):

+--------------------------------------+ 
| 1   Name Color Material MTTF | 
+--------------------------------------+ 
| Name   1 0.2  0.4 0.01 | 
| Color  0.2  1  0.03 0.08 | 
| Material 0.4 0.3  1 0.75 | 
| MTTF  0.01 0.08  0.75 1 | 
+--------------------------------------+ 
| 2   Name Color Material MTTF | 
+--------------------------------------+ 
| ...  Name Color Material MTTF | 
+--------------------------------------+ 

我想什麼CSV輸出會像下面的(請注意我已經刪除列,其中的相關性沒有意義):

+-------------------------------------------+ 
|  Material vs Color Material vs MTTF | 
+-------------------------------------------+ 
| 1    0.03    0.75 | 
| 2    0.15    0.80 | 
| ...          | 
+-------------------------------------------+ 

回答

1

目前尚不清楚哪些列是相關的。但是,您可以按照以下方式將相關矩陣平坦化:

# Generate random data. 
df = pd.DataFrame(np.random.randn(10, 3), columns=list('ABC')) 

# Create correlation matrix 
corr_matrix = df.corr() 
>>> corr_matrix 
      A   B   C 
A 1.000000 0.052204 -0.442129 
B 0.052204 1.000000 0.187938 
C -0.442129 0.187938 1.000000 

# Flatten correlation matrix. 
flat_cm = corr_matrix.stack().reset_index() 
flat_cm['A_vs_B'] = flat_cm.level_0 + '_' + flat_cm.level_1 
flat_cm.columns = ['A', 'B', 'correlation', 'A_vs_B']  
flat_cm = flat_cm.loc[flat_cm.correlation < 1, ['A_vs_B', 'correlation']] 
>>> flat_cm 
    A_vs_B correlation 
1 A_B -0.202226 
2 A_C -0.103136 
3 B_A -0.202226 
5 B_C  0.198216 
6 C_A -0.103136 
7 C_B  0.198216 
+0

這使我獲得了一部分。我的最終目標仍然是重新安排它,以便得到像「A vs B」和「B vs C」這樣的重新命名的列。下面的工作,但它似乎很多slashing並放回到一起,所以我不知道是否有更好的方法: ''' 'col1 = corr_list [(corr_list [「level_1」] =='A' )&(corr_list [「level_2」] =='B')]。rename(columns = {0:「A_vs_B」})' col1 = col1.filter([「Widget Num」,「A_vs_B」]) ' col2 = corr_list [(corr_list [「level_1」] =='B')&(corr_list [「level_2」] =='C')]。rename(columns = {0:「B_vs_C」})' 'col2 = col2.filter([「Widget Num」,「B_vs_C」])' 'pd.merge(col1,col2 ...)' – user1601333

+0

請參閱上面的編輯。 – Alexander