获取pandas中分类变量的映射

Bob*_*Bob 23 python pandas

我这样做是为了制作分类变量数字

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

       x
0   good
1    bad
2   good
3  great
Run Code Online (Sandbox Code Playgroud)

如何获取原始值和新值之间的映射?

Joh*_*hnE 48

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

dict( enumerate(df['x'].cat.categories ) )

# {0: 'bad', 1: 'good', 2: 'great'}
Run Code Online (Sandbox Code Playgroud)

要验证这是否有效,只需打印出如下所示的基础整数代码:

dict( zip( df['x'].cat.codes, df['x'] ) )

# {0: 'bad', 1: 'good', 2: 'great'}
Run Code Online (Sandbox Code Playgroud)

或者从类别到整数到字符串到类别进行往返:

type( df['x'].cat.categories )

# pandas.core.indexes.base.Index
Run Code Online (Sandbox Code Playgroud)

有关pandas分类变量的一般信息,请参阅官方文档

  • 你可以说得更详细点吗?听起来您尝试在非分类列上使用`cat`。您可以使用data.info()检查dtype,并可以使用astype('category')`将几乎任何列转换为分类。 (3认同)

Ara*_*ray 10

Hier 是我基于 Matheus Araujo 的回答的解决方案。

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

df.country = df.country.astype('category')
Run Code Online (Sandbox Code Playgroud)

以数组的形式获取每个值的代码:

df.country.cat.codes
Run Code Online (Sandbox Code Playgroud)

将代码数组转换回字符串

df.country.cat.categories[df.country.cat.codes]
Run Code Online (Sandbox Code Playgroud)

您还可以传递整数列表

df.country.cat.categories[[0, 1, 2]]
Run Code Online (Sandbox Code Playgroud)

或者单个代码

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


Mat*_*ujo 5

如果你运行这个:

df["column_category"].cat.categories.get_loc("item")

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

如果你运行这个:

df["column_category"].cat.categories[0]

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