方法一
您可以通过枚举创建字典映射(类似于通过从列表索引创建字典键从列表创建字典):
dict( enumerate(df['x'].cat.categories ) )
# {0: 'bad', 1: 'good', 2: 'great'}
方法二
或者,您可以在每行中映射值和代码:
dict( zip( df['x'].cat.codes, df['x'] ) )
# {0: 'bad', 1: 'good', 2: 'great'}
这里发生的事情更加透明,因此可以说更安全。它的效率也低得多,因为zip() 的参数长度是len(df),而df['x'].cat.categories 的长度只是唯一值的计数,通常比len(df) 短得多。
补充讨论
方法 1 起作用的原因是类别具有索引类型:
type( df['x'].cat.categories )
# pandas.core.indexes.base.Index
在这种情况下,您可以像查找列表一样在索引中查找值。
有几种方法可以验证方法 1 是否有效。首先,您可以检查往返行程是否保留正确的值:
(df['x'] == df['x'].cat.codes.map( dict(
enumerate(df['x'].cat.categories) ) ).astype('category')).all()
# True
或者您可以检查方法 1 和方法 2 是否给出相同的答案:
(dict( enumerate(df['x'].cat.categories ) ) == dict( zip( df['x'].cat.codes, df['x'] ) ))
# True