【问题标题】:Averaging values across rows and columns conditional on values in other columns with pandas使用 pandas 以其他列中的值为条件的跨行和列的平均值
【发布时间】:2013-01-19 18:22:20
【问题描述】:

我想使用 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 个标准差的反应时间之后)。

非常感谢任何帮助。

托马斯

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为这不是您的 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) &amp; (d["acc"] == 2)]["rt"]。

    【讨论】:

    • 非常感谢您非常有帮助的回复!当前形式的数据是从文本文件中读入的,我不得不承认我不确定如何在一开始就正确地重塑它们。更复杂的是,还有一个额外的要求,即仅当“b”正确时才应考虑“a”反应时间(因此,上述示例中的 710 和 810 实际上不应包括在均值计算中)。
    猜你喜欢
    • 2020-03-11
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多