1

パンダを使用して、他の列の値を条件として、いくつかの行と列の値を平均したいと思います。データフレームには次の情報が含まれています。

  • 精度を示す列 (「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 標準偏差を超える反応時間を除外した後)。

どんな助けでも大歓迎です。

トーマス

4

1 に答える 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"].

于 2013-02-04T23:51:04.117 に答える