班级中的NaN

时间:2019-12-14 15:14:01

标签: python machine-learning scikit-learn linear-regression data-science

我正在尝试对应用程序上的数据集进行线性回归,我分配的标签是应用程序的等级。尝试将标签拆分为多个类时,即使未指定,也存在第三类“ NaN”。

bins = (2, 3, 5)
group_names = ['bad', 'good']
appStore['user_rating'] = pd.cut(appStore['user_rating'], bins = bins, labels = group_names)
appStore['user_rating'].unique()

结果

[good, bad, NaN]
Categories (2, object): [bad < good]

我什至运行了代码

appStore.isnull().sum()

并且没有显示空值,所有字段的结果均为0。

编辑: 我什至将bins编辑为bins =(0,3,5)来拆分数据,因为该列中的最小值为0,最大值为5。它仍然具有NaN。

这是我运行sns.countplot(appStore ['user_rating'])时的结果:

如您所见,将没有异常数据。

1 个答案:

答案 0 :(得分:2)

使用pandas.cut()方法,我们可以像您一样定义具有 bin边缘的容器:

bins = (2, 3, 5)

意味着我们定义了两个有效的类别:

一个类别,其值介于(2和3)之间,而另一个类别在(3和5)之间。 这些类别之外的每个值的类别将为NaN

问题是,您的数据包含的值超出了您定义的时间间隔。我用一个例子演示它:

import pandas as pd

appStore = pd.DataFrame()
appStore['user_rating'] = [2.3, 3.3, 4, 6]

bins = (2, 3, 5)
group_names = ['bad', 'good']
appStore['user_rating'] = pd.cut(appStore['user_rating'], bins=bins, labels=group_names)
print(appStore['user_rating'].unique())

print()
print(appStore)

退出:

[bad, good, NaN]
Categories (2, object): [bad < good]

  user_rating
0         bad
1        good
2        good
3         NaN

您看到6既不在(2和3)之间,也不在(3和5)之间。 因此,基本上没有离群数据的标签,这就是为什么pandasNaN替换了一个丢失的标签值的原因。

如果您的数据中没有这样的异常值,则不会发生此问题:

import pandas as pd

appStore = pd.DataFrame()
appStore['user_rating'] = [2.3, 3.3, 4, 4.5]

bins = (2, 3, 5)
group_names = ['bad', 'good']
appStore['user_rating'] = pd.cut(appStore['user_rating'], bins=bins, labels=group_names)
print(appStore['user_rating'].unique())

print()
print(appStore)

退出:

[bad, good]
Categories (2, object): [bad < good]

  user_rating
0         bad
1        good
2        good
3        good

注意:bin边缘向下包含向上包含,例如(1,2,3)个边沿定义的垃圾箱将不包含1(它将归类为NaN),但是3将是(2-3)