2016-10-02 175 views
2

有没有简单的方法来计算一个熊猫DataFrame中的每一列的平均值,并且对于每一行排除的具体值?下面各行中的x标记要排除在计算在每次迭代中的值:Pandas DataFrame中每一行的平均函数排除值

a b      a b     a b 
0 1 2     0 x x    0 1 2 
1 2 4 first loop 1 2 4 second loop 1 x x etc. 
2 3 6  --->  2 3 6  --->  2 3 6 ---> 
3 4 8     3 4 8    3 4 8 
4 5 10     4 5 10    4 5 10 
          ____________    _____________ 
        col_avg: 3.5 7.0  col_avg: 3.25 6.5 

Using only 4 values at each iteration, as the "x" is excluded from data set 

造成了新的数据帧

a_x b_x 
0 3.5 7.0 
1 3.25 6.5 
2 3.0 6.0 
3 2.75 5.5 
4 2.5 5.0 

由于

/N

回答

3

要首先从第一步开始,假设我们有兴趣进行求和而不是计算平均值。在这种情况下,我们会在除了当前元素之外的每个列上添加所有元素。其他看待它/解决这个问题的方法是将每个柱上的所有元素相加,然后减去当前的元素本身。因此,基本上我们可以得到df.sum(0)的所有列的总和,并简单地从中减去df,保持轴 对齐。 Broadcasting会照顾到在所有列上一次执行这些操作。

为了进行第二步平均,我们简单地除以每个列的求和所涉及的元素的数量,即df.shape[0]-1

因此,我们将有一个量化的解决方案,像这样 -

df_out = (df.sum(0) - df)/float(df.shape[0]-1) 

采样运行 -

In [128]: df 
Out[128]: 
    a b 
0 1 2 
1 2 4 
2 3 6 
3 4 8 
4 5 10 

In [129]: (df.sum(0) - df)/float(df.shape[0]-1) 
Out[129]: 
     a b 
0 3.50 7.0 
1 3.25 6.5 
2 3.00 6.0 
3 2.75 5.5 
4 2.50 5.0 

要设置列名所需的,这样做:df_out.columns = ['a_x','b_x']

+0

谢谢,完美的作品! 由于数据包含NaN值,因此需要使用df.count()而不是df_shape [0]计算“真”平均值,否则我会将NaN计为实际值。然而,我没有在问题中具体说明,而只是供参考。 – gussilago

相关问题