如何知道 astype('category').cat.codes 分配的标签?

Posted

技术标签:

【中文标题】如何知道 astype(\'category\').cat.codes 分配的标签?【英文标题】:How to know the labels assigned by astype('category').cat.codes?如何知道 astype('category').cat.codes 分配的标签? 【发布时间】:2018-12-08 16:14:13 【问题描述】:

我有以下名为language 的数据框

         lang          level
0      english         intermediate
1      spanish         intermediate
2      spanish         basic
3      english         basic
4      english         advanced
5      spanish         intermediate
6      spanish         basic
7      spanish         advanced

我使用

将每个变量分类为数字

language.lang.astype('category').cat.codes

language.level.astype('category').cat.codes

分别。获取如下数据框:

      lang   level
0      0       1
1      1       1
2      1       0
3      0       0
4      0       2
5      1       1
6      1       0
7      1       2

现在,我想知道是否有办法获得每个值对应的原始值。我想知道lang 列中的0 值对应的是英文等等。

有什么功能可以让我找回这些信息吗?

【问题讨论】:

【参考方案1】:

你可以生成字典:

c = language.lang.astype('category')

d = dict(enumerate(c.cat.categories))
print (d)
0: 'english', 1: 'spanish'

那么如果有可能的话map:

language['code'] = language.lang.astype('category').cat.codes

language['level_back'] = language['code'].map(d)
print (language)
      lang         level  code level_back
0  english  intermediate     0    english
1  spanish  intermediate     1    spanish
2  spanish         basic     1    spanish
3  english         basic     0    english
4  english      advanced     0    english
5  spanish  intermediate     1    spanish
6  spanish         basic     1    spanish
7  spanish      advanced     1    spanish

【讨论】:

【参考方案2】:

你可以使用 .cat.categories 索引,像这样:

df.lang.cat.categories[0]

输出:

'english'

【讨论】:

【参考方案3】:

分类类型是分解的过程。这意味着每个唯一值或类别都被赋予一个从零开始递增的整数值。

例如:

c = language.lang.astype('category')

你有代码

codes = c.cat.codes

和中的类别

cats = c.cat.categories

它旨在使您能够利用 Numpy 数组切片,并且您可以通过

访问您的标签或类别
cats[codes]

Index(['english', 'spanish', 'spanish', 'english', 'english', 'spanish',
       'spanish', 'spanish'],
      dtype='object')

当您已经有了一个可以非常有效地查找它的构造时,就不需要构造一个字典来查找它。


作为进一步的示例,这就是我们可以使用pd.factorize 进行复制的方式

codes, cats = pd.factorize(language.lang)

print(cats, codes, cats[codes], sep='\n\n')

Index(['english', 'spanish'], dtype='object')

[0 1 1 0 0 1 1 1]

Index(['english', 'spanish', 'spanish', 'english', 'english', 'spanish',
       'spanish', 'spanish'],
      dtype='object')

【讨论】:

以上是关于如何知道 astype('category').cat.codes 分配的标签?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中是不是有与 python 中的 astype() 函数等效的函数?

numpy随笔-astype

numpy.astype(np.uint8) 如何转换浮点数组? -1.2997805 变为 255

如何在pandas数据帧中反转.astype(str)?

如何在 pandas DF 列中找出哪些值不能使用 astype 函数转换为“int”类型

astype 熊猫的错误​​?