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 中也*不会*包含该值的条目。
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])