pandas.Index.factorize#

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

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

当唯一重要的是识别不同值时,此方法对于获取数组的数字表示很有用。factorize 可作为顶级函数 pandas.factorize() ,也可作为方法 Series.factorize()Index.factorize() 使用。

Parameters:
sortbool,默认 False

uniques 进行排序并打乱 codes 以保持它们之间的关系。

use_na_sentinelbool, default True

如果为 True,则 NaN 值将使用 sentinel -1。如果为 False,NaN 值将被编码为非负整数,并且不会从值的 uniques 中删除 NaN。

在 1.5.0 版本加入.

Returns:
codesndarray

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

uniquesndarray, Index, or Categorical

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

备注

即使 values 中存在缺失值,uniques 中也*不会*包含该值的条目。

参见

cut

离散化连续值数组。

unique

查找数组中的唯一值。

Notes

参考 the user guide 以获取更多示例。

Examples

这些示例都将 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=True 时,uniques 将被排序,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 数组)进行了 factorize。在对 pandas 对象进行 factorize 时,uniques 的类型会有所不同。对于 Categoricals,将返回一个 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' 不在 cat.values 中,但它存在于 uniques.categories 中。

对于所有其他 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 包含在值的 uniques 中,可以通过将 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])