Pandas DataFrame中每一行的平均函数排除值
问题描述:
有没有简单的方法来计算一个熊猫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
答
要首先从第一步开始,假设我们有兴趣进行求和而不是计算平均值。在这种情况下,我们会在除了当前元素之外的每个列上添加所有元素。其他看待它/解决这个问题的方法是将每个柱上的所有元素相加,然后减去当前的元素本身。因此,基本上我们可以得到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']
。
谢谢,完美的作品! 由于数据包含NaN值,因此需要使用df.count()而不是df_shape [0]计算“真”平均值,否则我会将NaN计为实际值。然而,我没有在问题中具体说明,而只是供参考。 – gussilago