【问题标题】:How would you flip and fold diagonaly a matrix with pandas?你会如何用熊猫翻转和折叠矩阵?
【发布时间】:2021-08-03 15:29:05
【问题描述】:

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

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

stimA stimB subjectAnswer
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

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

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

pivoted 的预期输出:

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

非常感谢您的帮助!

【问题讨论】:

  • 您能否编辑问题以显示您期望来自session1 数据帧的所需输出?

标签: python pandas numpy statistics visualization


【解决方案1】:

如果我理解正确的话,刺激 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

【讨论】:

    【解决方案2】:

    sortstimAstimB 沿列轴,并在数据框中分配两个临时列 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
    

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 2016-09-02
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2016-08-26
      • 2021-08-30
      相关资源
      最近更新 更多