pandas.Index.factorize#

Index.factorize(sort=False, use_na_sentinel=True)[源代码]#

将对象编码为枚举类型或分类变量。

这种方法在所有需要的是识别不同值时,用于获取数组的数值表示非常有用。factorize 既可以作为顶级函数 pandas.factorize() 使用,也可以作为方法 Series.factorize()Index.factorize() 使用。

参数:
排序bool, 默认为 False

uniques 进行排序并打乱 codes 以保持关系。

use_na_sentinel布尔值, 默认为 True

如果为真,NaN 值将使用哨兵 -1。如果为假,NaN 值将被编码为非负整数,并且不会从值的唯一性中删除 NaN。

Added in version 1.5.0.

返回:
代码ndarray

一个整数 ndarray,它是 uniques 的索引器。uniques.take(codes) 将具有与 values 相同的值。

uniquesndarray, Index, 或 Categorical

唯一有效的值。当 values 是 Categorical 时,uniques 是一个 Categorical。当 values 是其他 pandas 对象时,返回一个 Index。否则,返回一个 1-D ndarray。

备注

即使在 values 中有一个缺失值,uniques 也不会包含它的条目。

参见

cut

离散化连续值数组。

唯一

在数组中找到唯一值。

备注

更多示例请参考 用户指南

例子

这些例子都展示了 factorize 作为一个顶级方法,例如 pd.factorize(values)。对于像 Series.factorize() 这样的方法,结果是相同的。

>>> codes, uniques = pd.factorize(np.array(['b', 'b', 'a', 'c', 'b'], dtype="O"))
>>> codes
array([0, 0, 1, 2, 0])
>>> uniques
array(['b', 'a', 'c'], dtype=object)

使用 sort=Trueuniques 将被排序,而 codes 将被打乱,以保持它们之间的关系。

>>> codes, uniques = pd.factorize(np.array(['b', 'b', 'a', 'c', 'b'], dtype="O"),
...                               sort=True)
>>> codes
array([1, 1, 0, 2, 1])
>>> uniques
array(['a', 'b', 'c'], dtype=object)

use_na_sentinel=True (默认值)时,缺失值在 codes 中用哨兵值 -1 表示,并且缺失值不包含在 uniques 中。

>>> codes, uniques = pd.factorize(np.array(['b', None, 'a', 'c', 'b'], dtype="O"))
>>> codes
array([ 0, -1,  1,  2,  0])
>>> uniques
array(['b', 'a', 'c'], dtype=object)

到目前为止,我们只对列表进行了因子分解(这些列表在内部被强制转换为 NumPy 数组)。当对 pandas 对象进行因子分解时,uniques 的类型将有所不同。对于分类数据,将返回一个 Categorical

>>> cat = pd.Categorical(['a', 'a', 'c'], categories=['a', 'b', 'c'])
>>> codes, uniques = pd.factorize(cat)
>>> codes
array([0, 0, 1])
>>> uniques
['a', 'c']
Categories (3, object): ['a', 'b', 'c']

注意 'b'uniques.categories 中,尽管它没有出现在 cat.values 中。

对于所有其他 pandas 对象,将返回适当类型的 Index。

>>> cat = pd.Series(['a', 'a', 'c'])
>>> codes, uniques = pd.factorize(cat)
>>> codes
array([0, 0, 1])
>>> uniques
Index(['a', 'c'], dtype='object')

如果在值中存在 NaN,并且我们希望在值的唯一性中包含 NaN,可以通过设置 use_na_sentinel=False 来实现。

>>> values = np.array([1, 2, 1, np.nan])
>>> codes, uniques = pd.factorize(values)  # default: use_na_sentinel=True
>>> codes
array([ 0,  1,  0, -1])
>>> uniques
array([1., 2.])
>>> codes, uniques = pd.factorize(values, use_na_sentinel=False)
>>> codes
array([0, 1, 0, 2])
>>> uniques
array([ 1.,  2., nan])