问题描述
让我们举个例子。 假设我们有一个列名为“f1”的数据框
f1 : {2,4,NaN,1,15}
当我们对其应用均值插补时,我们会编写这样的代码
dataframe['f1'].fillna(dataframe['f1'].mean())
所以我的疑问是当它在 dataframe['f1'].mean() 期间计算 f1 的平均值时,我知道它在求和期间(在分子中)排除了 NaN 值,因为它们可以't be added 但我想知道的是,除以值的总数时,它可以包含或排除在分母中。
mean 是这样计算的
mean(f1) = (2+4+1+15)/6(在值总数中包括 NaN)
或者这样
mean(f1) = (2+4+1+15)/4(不包括值总数中的 NaN)
另外,解释一下为什么? 提前致谢
解决方法
根据 the official documentation of pandas.DataFrame.mean "skipna" 参数排除了 NA/null 值。如果它被排除在分子但分母之外,这将在文档中专门提到。您可以通过使用虚拟数据框(例如您在问题中举例说明的数据框)执行简单实验来证明自己已将其排除在分母之外。
应该从分母中排除 NA/null 值的原因是为了在统计上是正确的。平均值是数字的总和除以它们的总数。如果您无法在总和中添加一个值,那么在分母中对其进行额外计数是没有意义的。如果将其计入分母,则它的行为就好像 NA/null 值为 0。但是,该值不是 0,它是未知的、未观察到的、隐藏的等。
如果您在实践中承认分布的性质,您可以根据分布的性质相应地 interpolate 或 fill NA/null 值,然后取所有值的平均值。例如,如果您意识到所讨论的特征具有线性性质,则可以使用“线性”方法插入缺失值。
,pd.Series.mean
仅计算非 NaN 值的均值,因此对于上述数据,均值是 (2+4+1+15)/4=5.5
,4 是非 NaN 值的数量,这是计算 {{ 的默认行为1}}。如果您想使用所有行作为分母包括给定系列的平均值,您可以在调用 mean
之前fillna(0)
:
直接调用mean()
:
mean()
在 df['f1'].fillna(df['f1'].mean())
0 2.0
1 4.0
2 5.5 <------
3 1.0
4 5.5 <------
5 15.0
Name: f1,dtype: float64
之后调用 mean()
:
fillna(0)