Pandas inplace fillna 改变意思

Pandas inplace fillna changes mean

我有一个在某些列中缺少值的数据框。我想用同一列中非缺失条目的平均值来填充这些缺失值。很容易证明在均值插补后平均值不应该改变。例如,假设有一列 m 项缺失,n 项非缺失项的总和为 s。均值插补步骤将用平均值 s/n 替换缺失的条目。替换后的平均值应该是

mean_after = ((s/n)*m + s)/(m+n) = s/n = mean_before_replacement

我认为这是一个合理的预期。但是,pandas 似乎违反了这个不变量。这是一个例子:

>>> import pandas as pd
>>> pd.__version__
'1.1.0'
>>> df = pd.read_csv("dftest.csv")
>>> df.describe()
                 a
count  1057.000000
mean      1.228950
std       0.420356
min       1.000000
25%       1.000000
50%       1.000000
75%       1.000000
max       2.000000
>>> df.notna().sum()
a    1057
dtype: int64
>>> df.isna().sum()
a    260
dtype: int64
>>> mean_before = df.a.mean()
>>> mean_before
1.2289498580889309
>>> df.fillna(dict(df.mean()), inplace=True)
>>> mean_after = df.a.mean()
>>> mean_after
1.228949858088931
>>> mean_before == mean_after
False

我是不是漏掉了什么?

我相信你看到了 machine epsilon。我们通常被告知浮点运算只能精确到小数点后约 15 位。

如果我没记错的话,您可以将所有值乘以相同的倍数(例如 1000),进行算术运算,然后除以相同的倍数以保持精度。另一种解决方案是舍入到第 14 位数字以允许该断言为真。

有关数学解释,请参阅此 math SO post