如何将序数值转换为分类值?

时间:2017-04-26 08:08:55

标签: python pandas scikit-learn data-analysis categorical-data

在Pandas DataFrame中,如何以序数数字形式表示分类特征(例如,当天是工作日还是周末)的列(例如,1表示工作日,2表示周末)进行转换,使其以分类方式表示值,工作日为(0,1),周末为(1,0),因此值不具有可比性?

还有使用pd.get_dummies(或OneHotEncoder)的替代方法,它会创建两个0和1的列,然后合并元组中的两列,但是没有直接的方式这样做?

实施例: 我有:

    datetime    temp    daytype
0   2011-01-01  9.84    2
1   2011-01-02  9.02    2
2   2011-01-03  9.02    1
3   2011-01-04  9.84    1
4   2011-01-05  9.84    1
5   2011-01-06  9.84    1

我想:

    datetime    temp    daytype
0   2011-01-01  9.84    (1, 0)
1   2011-01-02  9.02    (1, 0)
2   2011-01-03  9.02    (0, 1)
3   2011-01-04  9.84    (0, 1)
4   2011-01-05  9.84    (0, 1)
5   2011-01-06  9.84    (0, 1)

(我开始认为也许我错了 - 这不是表示分类值的默认方式吗?)

2 个答案:

答案 0 :(得分:2)

以下是一种方法:df['daytype'] = df['daytype'].apply(lambda x : (1, 0) if x == 2 else (0,1))

答案 1 :(得分:1)

你可以创建你的假人/一个热矢量,然后将它们组合成一个元组:

您的原始数据看起来像这样

import pandas as pd
df = pd.DataFrame({"daytype": [2, 2, 1, 1, 1, 2]})
print(df)

   daytype
0        2
1        2
2        1
3        1
4        1
5        2

我们可以创建虚拟变量,正如您正确指出的那样,将产生单独的列:

dummies = pd.get_dummies(df["daytype"]).astype(int)
print(dummies)

   1  2
0  0  1
1  0  1
2  1  0
3  1  0
4  1  0
5  0  1

但是,您可以将这些单独的列并将它们压缩在一起,并将结果作为原始列中的列分配:

df["combined"] = list(zip(dummies[1], dummies[2]))

给你:

print(df)

   daytype combined
0        2   (0, 1)
1        2   (0, 1)
2        1   (1, 0)
3        1   (1, 0)
4        1   (1, 0)
5        2   (0, 1)

当然,如果你愿意的话,你可以完全用组合替换原始列,我为了清晰起见将它们分开

以上内容将为您提供原始问题中所需的结果,但您也可以直接设置评论中提到的特定列的类型:

df['daytype'] = df['daytype'].astype('category')

最终,它将归结为您希望使用该列进行的操作