我认为这不是您的 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"]
.