我正在使用pandas来分解由两种类型的字符串组成的数组。我想确保其中一个字符串“XYZ”始终编码为0,另一个字符串“ABC”始终编码为1。
有可能这样做吗?我查了一下文档并没有找到任何有用的东西?
答案 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
。