Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DataFrame:将nan值替换为列的平均值_Python_Pandas_Nan - Fatal编程技术网

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

Python DataFrame:将nan值替换为列的平均值,python,pandas,nan,Python,Pandas,Nan,我有一个pandas数据框,其中大部分填充了实数,但也有一些nan值 如何将nans替换为所在列的平均值 这个问题与这个问题非常相似:但不幸的是,这里给出的解决方案不适用于熊猫数据帧 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]:

我有一个pandas数据框,其中大部分填充了实数,但也有一些
nan

如何将
nan
s替换为所在列的平均值

这个问题与这个问题非常相似:但不幸的是,这里给出的解决方案不适用于熊猫数据帧

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
您只需使用直接填充
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
的docstring说明
value
应该是标量或dict,但是,它似乎也适用于
系列。如果您想通过dict,可以使用
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()))

与以前的平均值响应相比,它没有那么优雅,但如果您希望用其他列函数替换空值,它可能会更短。

如果您想用平均值填充缺失的值,并且希望逐列进行填充,那么这将仅用该列的平均值进行填充。这可能更具可读性

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))

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

若要用该列的平均值填充空值,则可以使用

假设
x=df['Item\u Weight']
这里
Item\u Weight
是列名

我们在这里赋值(用x的平均值将x的空值填充到x中)

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

这里
Outlet\u size
是列名

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

熊猫:如何用一列的平均值、中值或其他统计数据替换NaN(
NaN
)值

假设您的数据帧是
df
,您有一列名为
nr\u items
。这是:
df['nr\u items']

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

使用方法
.fillna()

mean\u value=df['nr\u items'].mean()
df['nr_项目平均值]=df['nr_项目]]。填充值(平均值)

我创建了一个新的
df
列,名为
nr\u item\u ave
,用于存储新列,其中
NaN
值替换为该列的
mean


使用
平均值时应小心。如果您有异常值,建议您使用sklearn library preprocessing类使用
中值

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

注意:在最新版本中,参数
缺少_值
值从
nan
更改为
np.nan
,虽然下面的代码可以完成此任务,但当您处理记录为100k或更多的数据帧时,其性能会受到很大影响:

df.fillna(df.mean())
根据我的经验,应该只在需要时替换NaN值(无论是均值还是中值),而不是在整个数据帧上应用fillna()

我有一个包含20个变量的数据框架,其中只有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
下面是我观察到的性能,因为我一直在增加数据帧中的#记录

#------------------------------------------------
#----(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
具有约100k条记录的数据帧

  • 代码1:22.06秒
  • 代码2:0.03秒
具有约200k条记录的数据帧

  • 代码1:180.06秒
  • 代码2:0.06秒
具有约160万条记录的数据帧

  • 代码1:代码无休止地运行
  • 代码2:0.40秒
具有约1300万条记录的数据帧

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

抱歉回答得太长了!希望这有帮助

我使用此方法通过列的平均值来填充缺少的值

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

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

请解释一下这是如何解决问题的。我不知道为什么,但是df.fillna(df.mean())不起作用,只有你的版本使用apply。Python3
df.fillna(df.mean())
将返回新的数据帧,因此您必须编写
df=df.fillna(df.mean())
来保存它。您知道为什么我可能会使用此方法得到错误的平均值插补量吗?您也可以使用
df.fillna(df.mean(),inplace=True)来代替
警告:如果您想将其用于机器学习/数据科学:从数据科学的角度来看,首先替换NA然后分为训练和测试是错误的。。。您必须首先拆分为train和test,然后在train上用mean替换NA,然后将此有状态预处理模型应用于测试,请参见下面涉及sklearn的答案@amalik2205,否则您将从测试集向训练集泄漏信息!想象一下:我们有100个数据行,我们考虑列X。x的前99个条目是NA。我们想将第100行分割为一个测试集。假设第100行在第x列中的值为20。然后,您将用20替换列x中训练集中的所有条目,该值来自测试集的100%。因此,评估可能会欺骗你!所有这些与简单得多的替代方案相比有什么优势?@Roshan Jha解释逻辑总是更好的。在R&Python中有许多方法可以完成相同的任务。但是,如果您提出的是不同的建议,您可能需要指出这样做的一些优点,以供对inplace=True感到疑惑的人使用:如果是True,则原始对象将通过此更改进行修改。如果为False(默认),则函数不会修改原始对象,而是返回modif
fill_mean = lambda col : col.fillna(col.mean())

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