以其他列中的值为条件,使用pandas计算行和列的平均值

2024-09-28 21:31:30 发布

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

我想根据使用pandas的其他列中的值,在某些行和列上平均值。数据帧包含以下信息:

  • 表示准确度的列(缩写为“acc”)
    • 0=无响应
    • 1=不正确
    • 2=正确
  • 指示反应时间的列(缩写为“rt”)

以下是数据帧中信息的摘录:

a1_acc a1_rt a2_acc a2_rt a3_acc a3_rt b_acc b_rt
2      780   2      830   2      690   2     950
1      630   2      750   0      0     2     890
2      710   2      810   1      740   1     820

我想做的是把所有的“a”(而不是“b”)反应时间合并起来,如果它们来自正确的回答。也就是说,我想要一个包含以下反应时间的numpy数组(或其他合适的数据结构):

^{pr2}$

基于这些信息,我想计算平均反应时间(剔除偏离平均值超过3个标准偏差的反应时间)。在

任何帮助都将不胜感激。在

托马斯


Tags: 数据numpy信息a2数据结构pandasa1数组
1条回答
网友
1楼 · 发布于 2024-09-28 21:31:30

我认为这不是你的数据帧的最佳形状我认为像“字母”、“数字”、“acc”、“rt”之类的列(给它们起更有意义的名称)会更容易旋转。不管怎样,按照你目前的安排:

>>> d
   a1_acc  a1_rt  a2_acc  a2_rt  a3_acc  a3_rt  b_acc  b_rt
0       2    780       2    830       2    690      2   950
1       1    630       2    750       0      0      2   890
2       2    710       2    810       1    740      1   820

首先,我们对.ix进行切片,得到_acc列,并将它们与2列进行比较:

^{pr2}$

然后我们将其应用于_rt列的一部分:

>>> d.ix[:, 1:6:2][d.ix[:,0:6:2] == 2]
   a1_rt  a2_rt  a3_rt
0    780    830    690
1    NaN    750    NaN
2    710    810    NaN

压平这个:

>>> v = d.ix[:, 1:6:2][d.ix[:,0:6:2] == 2].unstack()
>>> v
a1_rt  0    780
       1    NaN
       2    710
a2_rt  0    830
       1    750
       2    810
a3_rt  0    690
       1    NaN
       2    NaN

现在我们可以取平均值并查看标准差(可能有一个内置函数来执行此操作,但我懒得查找),在需要的地方自动忽略NaN值:

>>> v.mean()
761.66666666666663
>>> dev = ((v-v.mean())/v.std()).abs() < 3
>>> dev
a1_rt  0     True
       1    False
       2     True
a2_rt  0     True
       1     True
       2     True
a3_rt  0     True
       1    False
       2    False

我们使用的所有值都在3个标准偏差范围内,所以这个切割不是很有趣,但我们可以无论如何应用它:

>>> v[dev].mean()
761.66666666666663

再一次,我会在一开始重新定义你的数据,这样.ix的丑陋可能更像{}。在

相关问题 更多 >