你将如何翻转和折叠带有Pandas的矩阵?

2024-10-01 18:39:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据,我想组织可视化和统计,但我不知道如何继续

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

^{tb1}$

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

^{tb2}$

我成功地将第一个表旋转到矩阵,但我无法成功地将其排列在数据对角线的左侧,以下是我的代码:

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','stimB','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

非常感谢你的帮助


Tags: 数据答案import主题可视化as矩阵nan
2条回答

如果我理解正确,刺激A和B是可以互换的。因此,要获得所需的矩阵布局,您可以在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', 'stimB']], 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

sort沿着列轴排列列stimAstimB,并在数据帧中分配两个临时列,即xy。这里需要排序,因为我们需要确保生成的矩阵在右上侧剪裁

以索引为y、列为x、值为subjectanswer的数据帧为轴心,然后重新为重塑后的帧编制索引,以确保矩阵的索引和列中存在所有可用的唯一stim名称

session1[['x', 'y']] = np.sort(session1[['stimA', 'stimB']], 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

相关问题 更多 >

    热门问题