pandas.factorize#

pandas.factorize(values, sort=False, use_na_sentinel=True, size_hint=None)[源代码][源代码]#

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

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

参数:
sequence

一个一维序列。不是 pandas 对象的序列在因子化之前会被强制转换为 ndarrays。

排序布尔值, 默认为 False

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

use_na_sentinel布尔值, 默认为 True

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

Added in version 1.5.0.

size_hintint, 可选

提示给哈希表大小调整器。

返回:
代码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])