是否可以在Pandas factorize方法中指定级别的顺序?

时间:2015-06-14 22:49:50

标签: python numpy pandas

我正在使用pandas来分解由两种类型的字符串组成的数组。我想确保其中一个字符串“XYZ”始终编码为0,另一个字符串“ABC”始终编码为1。

有可能这样做吗?我查了一下文档并没有找到任何有用的东西?

2 个答案:

答案 0 :(得分:3)

这是Categorical的目的,即(可选)在分解时指定实际类别(以及在需要时指定排序)。类别的排序将决定分解排序。如果未指定,那么外观的顺序将是类别的顺序。

这需要0.16.0才能直接在.astype中指定类别; Categoricals在0.15.0中引入

In [10]: s = Series(list('aaabbaa')).astype('category',categories=list('ab'))

In [11]: s.cat.codes
Out[11]: 
0    0
1    0
2    0
3    1
4    1
5    0
6    0
dtype: int8

因为我们现在是''' a'对于类别,则代码与上述相反。

In [12]: s = Series(list('aaabbaa')).astype('category',categories=list('ba'))

In [13]: s.cat.codes
Out[13]: 
0    1
1    1
2    1
3    0
4    0
5    1
6    1
dtype: int8

答案 1 :(得分:1)

AFAICT你不能直接用factorize做到这一点,但是很容易建立一个dict(你可以将其用于pandas的map)。

假设您有这样的Dataframe:

df = pd.DataFrame({'a': ['m', 'n', 'a', 'e', 'f']})

并且您想创建一个包含'a' - >的订单0,'e' - > 1.然后你可以用

做到这一点
>> dict([('a', 0), ('e', 1)] + [(e, i + 1) \
..  for (i, e) in enumerate(set(df.a.values) - set({'a', 'e'}))])
{'a': 0, 'e': 1, 'f': 3, 'm': 2, 'n': 1}

同样,你可以将它用于pandas的map