我正在尝试对应用程序上的数据集进行线性回归,我分配的标签是应用程序的等级。尝试将标签拆分为多个类时,即使未指定,也存在第三类“ 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'])时的结果:
如您所见,将没有异常数据。
答案 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)之间。
因此,基本上没有离群数据的标签,这就是为什么pandas
用NaN
替换了一个丢失的标签值的原因。
如果您的数据中没有这样的异常值,则不会发生此问题:
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)
。