【问题标题】:How to transform ordinal values into categorical ones?如何将序数值转换为分类值?
【发布时间】:2017-04-26 08:08:54
【问题描述】:

在 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)

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

【问题讨论】:

  • 我觉得你需要df['daytype'] = df['daytype'].astype('category')
  • 是的,文档中也推荐使用 astype 或 dtype。我相信我(错误地)在寻找一种方法来实际可视化这些值是不可比较的。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以创建虚拟对象/一个热向量,然后将它们组合成一个元组:

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

    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)
    

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

    上面将为您提供您在原始问题中发布的所需结果,但是您也可以直接设置该特定列的类型,如 cmets 中所述:

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

    最终会归结为您想使用该列做什么

    【讨论】:

    • 是的,get_dummies + merge 会给我我想要的,但我想知道是否有一些编码器可以直接做到这一点:D。谢谢。
    • 我可能是错的,但我认为没有内置函数可以直接为您提供这一点,因为我想不出以这种方式表示类别会有用的情况。您打算用新的组合列做什么?
    • 我正计划对转换后的数据框进行线性回归。
    • 我不确定您打算如何将元组 (0,1) 作为回归的预测因子。当您对分类数据进行线性回归时,虚拟变量方法是正确的,即您有单独的列来表示每个类别与参考类别之间的对比
    • 另外,如果您将元组存储在数据框列中,当您想稍后将其用于回归时,无论如何您都需要将元组拆分为单个元素。因此,如果您最终必须将其拆分,那么首先以这种方式存储它没有多大意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2012-09-26
    相关资源
    最近更新 更多