pandas DataFrame:将nan值替换为列的平均值

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

我如何用它们所在列的平均值替换__abc0 ?

这个问题与这个问题非常相似:Numpy数组:将nan值替换为列的平均值,但不幸的是,这里给出的解决方案不适用于熊猫数据框架。

607458 次浏览
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

你可以简单地使用DataFrame.fillna直接填充nan:

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()

试一试:

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

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

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

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

如果你想用均值来替换缺失的值你想一列一列地替换,那么这个只会替换那一列的均值。这可能更容易读。

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))
# 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])

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

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

假设这里的x=df['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')

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

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

如果你想用列均值取代你的列df['nr_items']NaN值:

使用方法.fillna():

< p > <代码> mean_value = df [' nr_items '] .mean () < br > df [' nr_item_ave '] = df (' nr_items '] .fillna (mean_value) < /代码> < / p >

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

在使用mean时应该小心。如果你有离群值,更推荐使用median

使用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的值从NaN变为np.nan

虽然,下面的代码可以完成工作,但它的性能会受到很大的影响,因为你处理一个#记录100k或更多的DataFrame:

df.fillna(df.mean())

根据我的经验,应该替换NaN值(无论是Mean还是Median), 只在需要的地方,而不是在整个数据帧上应用fillna()

我有一个包含20个变量的DataFrame,其中只有4个需要NaN值处理(替换)。我尝试了上面的代码(代码1),以及它的一个轻微修改版本(代码2),我有选择地运行它。仅适用于具有NaN值的变量

#------------------------------------------------
#----(Code 1) Treatment on overall DataFrame-----


df.fillna(df.mean())


#------------------------------------------------
#----(Code 2) Selective Treatment----------------


for i in df.columns[df.isnull().any(axis=0)]:     #---Applying Only on variables with NaN values
df[i].fillna(df[i].mean(),inplace=True)


#---df.isnull().any(axis=0) gives True/False flag (Boolean value series),
#---which when applied on df.columns[], helps identify variables with NaN values

下面是我观察到的性能,因为我一直在增加DataFrame中的#记录

DataFrame与~100k记录

  • 代码1:22.06秒
  • 代码2:0.03秒

DataFrame有~200k条记录

  • 代码1:180.06秒
  • 代码2:0.06秒

DataFrame有大约160万条记录

  • 代码1:代码不停地运行
  • 代码2:0.40秒

DataFrame有大约1300万条记录

  • 代码1:——甚至没有尝试,在看到1.6 Mn记录的性能之后——
  • 代码2:3.20秒

很抱歉回答这么长!希望这能有所帮助!

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

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


df = df.apply(fill_mean, axis = 0)

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

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

在这里是value_counts api引用。