我在一个关于应用的数据集上尝试进行线性回归,并将应用的评级作为标签。当我试图将标签分成不同的类别时,即使没有指定,也出现了第三个类别’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’])的结果:
如你所见,没有异常数据。
回答:
使用pandas.cut()方法,我们可以像你那样定义bin边界:
bins = (2, 3, 5)
这意味着我们定义了两个有效的类别:
一个类别包含值在(2和3)之间,另一个类别在(3和5)之间。任何不在这些类别范围内的值将被标记为NaN
。
问题在于,你的数据中包含了不在你定义的区间内的值。我用一个例子来演示:
import pandas as pdappStore = 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_rating0 bad1 good2 good3 NaN
如你所见,6
既不属于(2和3)之间,也不属于(3和5)之间。因此,对于这些异常数据,你没有定义标签,所以pandas
用NaN
来替代缺失的标签值。
如果你数据中没有这样的异常值,那么这个问题就不会发生:
import pandas as pdappStore = 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_rating0 bad1 good2 good3 good
注意: bin边界是向下排除和向上包含的,例如,定义为(1,2,3)
的边界不会包含1
(它将被归类为NaN
),但会包含3
作为(2-3)
的一部分。