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。
我有一个在某些列中缺少值的数据框。我想用同一列中非缺失条目的平均值来填充这些缺失值。很容易证明在均值插补后平均值不应该改变。例如,假设有一列 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。