代码之家  ›  专栏  ›  技术社区  ›  stone rock

如何将分类数据转换为数值数据?[副本]

  •  0
  • stone rock  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有功能=> city 它是分类数据,即字符串,但不是使用 replace() 有什么聪明的方法吗?

    train['city'].unique()
    Output: ['city_149', 'city_83', 'city_16', 'city_64', 'city_100', 'city_21',
           'city_114', 'city_103', 'city_97', 'city_160', 'city_65',
           'city_90', 'city_75', 'city_136', 'city_159', 'city_67', 'city_28',
           'city_10', 'city_73', 'city_76', 'city_104', 'city_27', 'city_30',
           'city_61', 'city_99', 'city_41', 'city_142', 'city_9', 'city_116',
           'city_128', 'city_74', 'city_69', 'city_1', 'city_176', 'city_40',
           'city_123', 'city_152', 'city_165', 'city_89', 'city_36', .......]
    

    我想说的是:

    train.replace(['city_149', 'city_83', 'city_16', 'city_64', 'city_100', 'city_21',
               'city_114', 'city_103', 'city_97', 'city_160', 'city_65',
               'city_90', 'city_75', 'city_136', 'city_159', 'city_67', 'city_28',
               'city_10', 'city_73', 'city_76', 'city_104', 'city_27', 'city_30',
               'city_61', 'city_99', 'city_41', 'city_142', 'city_9', 'city_116',
               'city_128', 'city_74', 'city_69', 'city_1', 'city_176', 'city_40',
               'city_123', 'city_152', 'city_165', 'city_89', 'city_36', .......], [1,2,3,4,5,6,7,8,9....], inplace=True)
    

    有没有更好的方法把数据转换成数字?因为唯一值的数目是 123 是的。 所以我需要硬编码从1,2,3,4,…123来转换它。建议一些更好的方法将其转换为数值。

    3 回复  |  直到 6 年前
        1
  •  4
  •   sacuL    6 年前

    试用 pd.factorize() 以下内容:

    train['city'] = pd.factorize(train.city)[0]
    

    或者 categorical dtypes 以下内容:

    train['city'] = train['city'].astype('category').cat.codes
    

    例如:

    >>> train
           city
    0  city_151
    1  city_149
    2  city_151
    3  city_149
    4  city_149
    5  city_149
    6  city_151
    7  city_151
    8  city_150
    9  city_151
    

    factorize 以下内容:

    train['city'] = pd.factorize(train.city)[0]
    
    >>> train
       city
    0     0
    1     1
    2     0
    3     1
    4     1
    5     1
    6     0
    7     0
    8     2
    9     0
    

    或者 astype('category') 以下内容:

    train['city'] = train['city'].astype('category').cat.codes
    
    >>> train
       city
    0     2
    1     0
    2     2
    3     0
    4     0
    5     0
    6     2
    7     2
    8     1
    9     2
    
        2
  •  1
  •   iDrwish    6 年前

    你可以通过 mapping 以下内容:

       value_mapper = dict(zip(train['city'].unique(), np.arange(1, 124)))
        train['city'].map(value_mapper)
    

    或者更地道的 categorical data 以下内容:

    pd.Categorical(train['city']).codes
    
        3
  •  1
  •   Void Star    6 年前

    如果值在整数之前始终有下划线,则列表理解可能对您有用:

    data = [int(x.split('_')[-1]) for x in train['city']]
    

    每个人的理解循环 x 在里面 train['city'] ,拆分 转换为下划线分隔的部分,并将最后一部分转换为整数。如果有多个下划线(如foo_bar_5),则此操作有效。