Python 提供了多种将变量转换为分类变量的方法。
import numpy as np
import pandas as pd
mydata = pd.Series(['A', 'B', 'B', 'C'])
mydata
0 A
1 B
2 B
3 C
dtype: object
pd.factorize(mydata) # Outputs a tuple with an array and an index
(array([0, 1, 1, 2], dtype=int64), Index(['A', 'B', 'C'], dtype='object'))
pd.Categorical(mydata) # Outputs a pandas. How do you extract categories?
['A', 'B', 'B', 'C']
Categories (3, object): ['A', 'B', 'C']
mydata.astype('category') # Outputs a series. How do you extract categories?
0 A
1 B
2 B
3 C
dtype: category
Categories (3, object): ['A', 'B', 'C']
还有更多替代方案,例如 sklearn LabelEncoder 和 keras to_categorical,它们与管道一起使用,因为它们保留转换并允许将它们重新应用到新数据。
您能否解释一下这些方法的差异、优点或局限性,以及它们的不同应用:factorize()、categorical() 和 astype("category")?
例如,如果我想将它们用于决策树模型,或者我只想计算频率表。
哪一种更容易使用或更通用?例如,如果之后我想修改一个类别或添加一个新类别或更改一个值或合并两个类别。
Python 中的方法
factorize()
、categorical()
和 astype("category")
提供了将变量转换为分类数据的不同方法:
pandas.factorize
文档:
当最重要的是识别不同的值时,此方法对于获取数组的数字表示非常有用。它返回一个元组,其中包含编码值数组和将原始类别映射到编码值的索引。 factorize()
的优点是它提供了一种简单有效的方法将分类数据转换为数字形式。但是,它不直接提供分类数据本身,仅提供编码值。pandas.Categorical
docs:此方法创建一个 pandas 分类对象(有限且通常固定的可能值(类别)数量),它代表一个分类变量。它返回一个 pandas
分类系列,其中包含原始数据以及类别。 Categorical()
的优点是它明确表示类别并允许您使用 .categories attribute
提取它们。它还提供了额外的功能,例如 ordering
和 renaming
类别。但是,它不会将数据编码为数字形式,如factorize()
。astype("category")
:此方法将 pandas 系列或列转换为分类数据类型。它返回数据类型设置为“类别”的系列。 astype("category")
的优点是它允许您在 pandas DataFrame 中高效地存储和操作分类数据。它还提供了一些基本功能,例如使用 .cat.categories attribute
访问类别。但是,它不像其他方法那样提供直接编码或类别的显式表示。对于
decision tree
模型,您可以根据您的具体要求使用这些方法中的任何一种。
factorize()
将是最简单的选择。Categorical()
会更合适。astype("category")
将是一个不错的选择。在修改类别或添加新类别方面,
Categorical()
和astype("category")
都允许您这样做。
Categorical()
,您可以使用 .rename_categories()
方法更改类别名称,使用 .add_categories()
方法添加新类别。astype("category")
,您可以直接将新类别分配给 .cat.categories
属性。总的来说,方法的选择取决于您的具体需求以及您需要的功能
model
。