8

我可以将熊猫字符串列转换为分类,但是当我尝试将其作为新的 DataFrame 列插入时,它似乎立即转换回 str 系列:

train['LocationNFactor'] = pd.Categorical.from_array(train['LocationNormalized'])

>>> type(pd.Categorical.from_array(train['LocationNormalized']))
<class 'pandas.core.categorical.Categorical'>
# however it got converted back to...
>>> type(train['LocationNFactor'][2])
<type 'str'>
>>> train['LocationNFactor'][2]
'Hampshire'

猜测这是因为 Categorical 没有映射到任何 numpy dtype;那么我是否必须将其转换为某种 int 类型,从而失去因子标签<->级别关联?存储级别<->标签关联并保留转换回来的能力的最优雅的解决方法是什么?(只需像这里一样存储为 dict ,并在需要时手动转换?)我认为Categorical 仍然不是 DataFrame 的一流数据类型,与 R 不同。

(使用 pandas 0.10.1、numpy 1.6.2、python 2.7.3 - 一切的最新 macports 版本)。

4

2 回答 2

7

我发现的 pandas pre-0.15的唯一解决方法如下:

  • 列必须转换为分类器的分类,但 numpy 会立即将级别强制转换回 int,从而丢失因子信息
  • 所以将因子存储在数据框外的全局变量中

.

train_LocationNFactor = pd.Categorical.from_array(train['LocationNormalized']) # default order: alphabetical

train['LocationNFactor'] = train_LocationNFactor.labels # insert in dataframe

[更新:pandas 0.15+ 增加了对分类的支持]

于 2013-08-04T06:19:42.563 回答
0

标签<->级别存储在索引对象中。

  • 将整数数组转换为字符串数组:index[integer_array]
  • 将字符串数组转换为整数数组: index.get_indexer(string_array)

这是一些例子:

In [56]:

c = pd.Categorical.from_array(['a', 'b', 'c', 'd', 'e'])

idx = c.levels

In [57]:

idx[[1,2,1,2,3]]

Out[57]:

Index([b, c, b, c, d], dtype=object)

In [58]:

idx.get_indexer(["a","c","d","e","a"])

Out[58]:

array([0, 2, 3, 4, 0])
于 2013-03-12T12:49:15.903 回答