将Pandas Correlation转换为列

时间:2015-12-03 23:08:21

标签: python pandas

我有一个数据集,我按项目分组(例如"小部件"),然后运行相关性。结果为每个小部件提供了一个矩阵,但由于我有大量的小部件,因此很难读取任何导出的CSV。

有没有一种简单的方法可以将矩阵转换为代表"列vs列#34的列;值?由于进入相关性的一些列肯定不相关,因此进一步混淆了这一点。

我尝试了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 个答案:

答案 0 :(得分:2)

目前尚不清楚哪些列是相关的。但是,您可以按如下方式展平相关矩阵:

# 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