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

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

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


当前回答

除此之外,还有一种选择:

df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))

它没有之前的mean响应那么优雅,但如果您希望用其他列函数替换null,那么它可以更短。

其他回答

使用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

# To read data from csv file
Dataset = pd.read_csv('Data.csv')

X = Dataset.iloc[:, :-1].values

# To calculate mean use imputer class
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])

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

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

下面是value_counts api引用。

您可以简单地使用DataFrame。Fillna直接填充楠的:

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

In [28]: df.mean()
Out[28]: 
A   -0.151121
B   -0.231291
C   -0.530307
dtype: float64

In [29]: df.fillna(df.mean())
Out[29]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325  1.533582
4 -0.151121 -0.231291  0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858  1.033826 -0.530307
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

fillna的文档字符串说value应该是标量或字典,然而,它似乎也适用于Series。如果你想传递一个字典,你可以使用df.mean().to_dict()。

Pandas:如何将NaN (NaN)值替换为一列的平均值(平均值)、中位数或其他统计数据

假设你的DataFrame是df,你有一列叫做nr_items。这是:df['nr_items']

如果你想用列的平均值替换你的列df['nr_items']的NaN值:

使用方法.fillna():

mean_value = df [' nr_items '] .mean () df [' nr_item_ave '] = df (' nr_items '] .fillna (mean_value)

我已经创建了一个名为nr_item_ave的新df列来存储新列,其中NaN值被该列的平均值替换。

你在使用平均数时要小心。如果你有异常值,更推荐使用中位数