Python 获取熊猫中分类变量的映射

Python 获取熊猫中分类变量的映射,python,pandas,Python,Pandas,我这样做是为了制造分类变量 >>> df = pd.DataFrame({'x':['good', 'bad', 'good', 'great']}, dtype='category') x 0 good 1 bad 2 good 3 great 如何获得原始值和新值之间的映射?方法1 可以通过枚举创建字典映射(类似于通过从列表索引创建字典键从列表创建字典): 方法2 或者,您可以映射每行中的值和代码: 这里发生的事情更加透明,因此可以说更加安

我这样做是为了制造分类变量

>>> df = pd.DataFrame({'x':['good', 'bad', 'good', 'great']}, dtype='category')

       x
0   good
1    bad
2   good
3  great
如何获得原始值和新值之间的映射?

方法1 可以通过枚举创建字典映射(类似于通过从列表索引创建字典键从列表创建字典):

方法2 或者,您可以映射每行中的值和代码:

这里发生的事情更加透明,因此可以说更加安全。由于
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
如果运行此命令:

df[“列类别]。类别。获取位置(“项目”)

它将返回对应于映射中“项”的代码(例如0)

如果运行此命令:

df[“column\u category”].cat.categories[0]


它将返回对应于映射位置0的代码值(例如“项”)

这是基于Matheus Araujo答案的我的解决方案

假设我们有一个国家专栏。首先,必须将列转换为分类数据类型:

df.country = df.country.astype('category')
以数组形式获取每个值的代码:

df.country.cat.codes
将代码数组转换回字符串

df.country.cat.categories[df.country.cat.codes]
您还可以传递整数列表

df.country.cat.categories[[0, 1, 2]]
还是一个代码

df.country.cat.categories[0]

你能发布一些原始的输入数据和代码来构造你的df吗?这样我们就可以重现你的数据了。它是说这个AttributeError:“Series”对象没有属性“cat”,你能更具体一点吗?听起来好像您试图在一个非类别的列上使用
cat
。您可以使用
data.info()
检查数据类型,并且可以使用
astype('category')
将几乎任何列转换为分类。
df.country.cat.categories[[0, 1, 2]]
df.country.cat.categories[0]