2015-12-03 73 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