你会如何用熊猫对角线翻转和折叠矩阵?

问题描述

我想组织一些数据以进行可视化和统计,但我不知道如何进行。

数据分 3 列(stimA、stimB 和 subjectAnswer)和 10 行(成对数),它们来自成对比较测试,采用熊猫的 dataFrame 格式。示例:

stimA 刺激 主题答案
1 2 36
3 1 55
5 3 98
... ... ...

我的目标是将它们组织成一个矩阵,每行和每列对应一个刺激,其中 subjectAnswer 数据分组到矩阵对角线的左侧(在我的示例中,subjectAnswer 36 对应于 stimA 1 和 stimB 2应该转到索引 [2][1]),如下所示:

stimA/stimB 1 2 3 4 5
1 ...
2 36
3 55
4 ...
5 ... ... 98

我成功地将第一个表转为矩阵,但我无法成功完成数据诊断左侧的排列,这是我的代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


session1 = pd.read_csv(filepath,names=['stimA','stimB','subjectAnswer'])


piVoted = session1.pivot('stimA','subjectAnswer')

给出:

会话 1:

   stimA  stimB  subjectAnswer
0      1      3              6
1      4      3             21
2      4      5             26
3      2      3             10
4      1      2              6
5      1      5              6
6      4      1              6
7      5      2             13
8      3      5             15
9      2      4             26

旋转:

stimB    1     2     3     4     5
stimA                             
1      NaN   6.0   6.0   NaN   6.0
2      NaN   NaN  10.0  26.0   NaN
3      NaN   NaN   NaN   NaN  15.0
4      6.0   NaN  21.0   NaN  26.0
5      NaN  13.0   NaN   NaN   NaN

旋转的预期输出

stimB    1     2     3     4     5
stimA                             
1      NaN   NaN   Nan   NaN   NaN
2      6.0   NaN  Nan  NaN   NaN
3      6.0   10.0   NaN   NaN  NaN
4      6.0   26.0  21.0   NaN  NaN
5      6.0  13.0   15.0   26.0   NaN

非常感谢您的帮助!

解决方法

如果我理解正确的话,刺激 A 和 B 是可以互换的。因此,要获得您想要的矩阵布局,您可以在 A 小于 B 的那些行中将 A 与 B 交换。换句话说,您不使用原始的 A 和 B 作为数据透视表,而是使用的最大值和最小值甲和乙:

session1['stim_min'] = np.min(session1[['stimA','stimB']],axis=1)
session1['stim_max'] = np.max(session1[['stimA',axis=1)

pivoted = session1.pivot('stim_max','stim_min','subjectAnswer')
pivoted
  stim_min  1       2       3       4
stim_max                
2           6.0     NaN     NaN     NaN
3           6.0     10.0    NaN     NaN
4           6.0     26.0    21.0    NaN
5           6.0     13.0    15.0    26.0
,

sortstimAstimB 沿列轴,并在数据框中分配两个临时列,即 xy。这里需要排序,因为我们需要确保得到的矩阵裁剪在右上方。

使用索引为 y、列为 x 和值为 subjectanswer 的数据框,然后重新索引重构的框以确保所有可用的唯一 stim名称出现在矩阵的索引和列中

session1[['x','y']] = np.sort(session1[['stimA',axis=1)

i = np.union1d(session1['x'],session1['y'])
session1.pivot('y','x','subjectAnswer').reindex(i,i)

x    1     2     3     4   5
y                           
1  NaN   NaN   NaN   NaN NaN
2  6.0   NaN   NaN   NaN NaN
3  6.0  10.0   NaN   NaN NaN
4  6.0  26.0  21.0   NaN NaN
5  6.0  13.0  15.0  26.0 NaN