我有一个熊猫DataFrame填充大部分实数,但有一些nan值在它以及。

我怎么能把这些nan替换成它们所在列的平均值呢?

这个问题与下面这个问题非常相似:numpy array:用列的平均值替换nan值,但不幸的是,这里给出的解决方案不适用于pandas DataFrame。


当前回答

使用sklearn库预处理类

from sklearn.impute import SimpleImputer
missingvalues = SimpleImputer(missing_values = np.nan, strategy = 'mean', axis = 0)
missingvalues = missingvalues.fit(x[:,1:3])
x[:,1:3] = missingvalues.transform(x[:,1:3])

注意:在最近的版本中,missing_values参数值更改为np。nan源自nan

其他回答

Try:

sub2['income'].fillna((sub2['income'].mean()), inplace=True)

直接使用df.fillna(df.mean())将所有空值填充为mean

如果你想用该列的平均值填充空值,那么你可以使用这个

假设x=df['Item_Weight']这里Item_Weight是列名

这里我们赋值(用x的均值填充x的空值)

df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))

如果你想用一些字符串填充空值,那么使用

这里Outlet_size是列名

df.Outlet_Size = df.Outlet_Size.fillna('Missing')

您还可以使用value_counts来获取最频繁的值。这适用于不同的数据类型。

df = df.apply(lambda x:x.fillna(x.value_counts().index[0]))

下面是value_counts api引用。

我使用这个方法来填充一个列的平均值。

fill_mean = lambda col : col.fillna(col.mean())

df = df.apply(fill_mean, axis = 0)
In [16]: df = DataFrame(np.random.randn(10,3))

In [17]: df.iloc[3:5,0] = np.nan

In [18]: df.iloc[4:6,1] = np.nan

In [19]: df.iloc[5:8,2] = np.nan

In [20]: df
Out[20]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3       NaN -0.985188 -0.324136
4       NaN       NaN  0.238512
5  0.769657       NaN       NaN
6  0.141951  0.326064       NaN
7 -1.694475 -0.523440       NaN
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

In [22]: df.mean()
Out[22]: 
0   -0.251534
1   -0.040622
2   -0.841219
dtype: float64

每列应用该列的平均值并填充

In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622  0.238512
5  0.769657 -0.040622 -0.841219
6  0.141951  0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794