使用pandas根据其他列的值对行和列进行平均值计算

1 投票
1 回答
600 浏览
提问于 2025-04-17 14:45

我想用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数组(或者其他合适的数据结构),里面包含以下的反应时间:

780, 830, 690, 750, 710, 810

根据这些信息,我还想计算平均反应时间(在计算之前,先排除那些偏离平均值超过3个标准差的反应时间)。

任何帮助都会非常感谢。

托马斯

1 个回答

3

我觉得你的数据框(DataFrame)现在的形状不是最理想的。像“letter”、“number”、“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进行比较:

>>> d.ix[:,0:6:2] == 2
  a1_acc a2_acc a3_acc
0   True   True   True
1  False   True  False
2   True   True  False

然后,我们对 _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 的复杂情况就可以变得更简单,比如可以写成 d[(d["letter"] == a) & (d["acc"] == 2)]["rt"]

撰写回答