python - 执行 StandardScaler 后将 NaN 分配给 -1

标签 python pandas dataframe scikit-learn

我想要StandardScaler(通过SK学习)某些DataFrame,其中包含很多NaN值,并且在执行此缩放器移位之后我想分配所有NaN至-1。我们知道 StandardScaler 不适用于 NaN 值,这怎么可能?

如果有任何其他解决方案(不依赖于Scikit Learn)也请提及。

df = pd.DataFrame(StandardScaler().fit_transform(values_to_scale.values))

我收到以下错误消息:

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

最佳答案

处理 NaN 值并不那么简单。它需要在采取任何进一步步骤处理 NaN 值之前对数据进行分析。有多种方法可以处理这些缺失值(以下不是详尽的列表):

  • 完全忽略缺失值:这种方法的问题是缺失的行可能包含其他列中的重要信息,忽略它们会导致分析不完整
  • 将它们替换为其他值:这是常用的方法之一,但您将用于替换的值的选择将影响您的整体分析。您可以用平均值或占位符值(如 -1)替换它们,您知道该值在整个列中不会出现。

  • 使用回归来替换值

  • **使用KNN替换值**

您可以查看以下链接,以获得更好的想法

此外,您可以查看 official sklearn documentation for imputing missing values .

更新:您可以在执行 StandardScalar 时忽略 NaN 值,如下所示

import numpy as np    
import pandas as pd
from sklearn.preprocessing import StandardScaler

#Create a dataframe
df = pd.DataFrame({'col1': [0, np.nan, 2, 3, np.nan, 4, 5, np.nan, 6, 7, np.nan]})

#Get the index of null values
null_values = d['col1'].isnull()

#Perform standard scalar on only non-NaN values
df.loc[~null_values, ['col1']] = StandardScaler().fit_transform(df.loc[~null_values, ['col1']])

输出

    col1
0   -1.728498
1   NaN
2   -0.832240
3   -0.384111
4   NaN
5   0.064018
6   0.512148
7   NaN
8   0.960277
9   1.408406
10  NaN

然后使用 df.fillna 填充 nan 值

df.fillna(-1)

输出

    col1
0   -1.728498
1   -1.000000
2   -0.832240
3   -0.384111
4   -1.000000
5   0.064018
6   0.512148
7   -1.000000
8   0.960277
9   1.408406
10  -1.000000

关于python - 执行 StandardScaler 后将 NaN 分配给 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50897516/

相关文章:

python - 如何在特定日期移动数据框中行的时间戳

python - 使用 python pandas DataFrame 上其他列的信息创建新列

python - 有没有一种方法可以有效地转换 DataFrame 列中的数据类型?

python - 如何在 pandas groupby 中移动整个组

python - 列表切片并找到第二大值python

python - Pandas :将两列合并为具有相应值的一列

javascript - 如何在 HTML 上的 javascript 上从 Flask 打印数组元素

python - 类和函数的装饰器

python - Pandas - 按时间间隔截断数据帧

python - 查找由 Pandas 中的列表元素组成的系列的模式