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=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 数组)。当对 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])