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

Mar*_*isa 8 python dataframe pandas categorical-data

我有以下数据框称为 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
Run Code Online (Sandbox Code Playgroud)

我通过使用将每个变量分类为数字

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
Run Code Online (Sandbox Code Playgroud)

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

是否有任何功能可以让我收回这些信息?

jez*_*ael 12

你可以生成字典:

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

d = dict(enumerate(c.cat.categories))
print (d)
{0: 'english', 1: 'spanish'}
Run Code Online (Sandbox Code Playgroud)

那么如果有必要,那么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
Run Code Online (Sandbox Code Playgroud)


Sco*_*ton 7

您可以使用.cat.categories索引,如下所示:

df.lang.cat.categories[0]
Run Code Online (Sandbox Code Playgroud)

输出:

'english'
Run Code Online (Sandbox Code Playgroud)


piR*_*red 7

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

例如:

c = language.lang.astype('category')
Run Code Online (Sandbox Code Playgroud)

您已获得代码

codes = c.cat.codes
Run Code Online (Sandbox Code Playgroud)

以及类别中

cats = c.cat.categories
Run Code Online (Sandbox Code Playgroud)

它旨在使您能够利用 Numpy 数组切片,并且您可以通过以下方式访问您的标签或类别

cats[codes]

Index(['english', 'spanish', 'spanish', 'english', 'english', 'spanish',
       'spanish', 'spanish'],
      dtype='object')
Run Code Online (Sandbox Code Playgroud)

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


作为进一步的例子,这就是我们如何复制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')
Run Code Online (Sandbox Code Playgroud)