如何从字符串列范畴的熊猫数据框列?(How to generate pandas DataFrame

2019-07-21 09:18发布

我可以在熊猫字符串列转换为范畴,但是当我尝试插入它,因为它似乎变得转换右回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'

猜测这是因为直言不映射到任何numpy的D型; 所以我必须把它转换为某种整型,从而失去因子标签< - >水平的关联? 什么是最优雅的解决方法来存储水平< - >标签协会和留住转换回的能力吗? (只储存像一个字典这里 ,并手动在需要时转换?)我觉得范畴仍然不是一个一流的数据类型数据框中 ,不像R.

(使用熊猫0.10.1,numpy的1.6.2,2.7.3蟒蛇 - 一切最新的MacPorts版本)。

Answer 1:

大熊猫唯一的解决方法预先0.15我发现如下:

  • 列必须被转换成一个明确的分类,但numpy的将立即强制该水平恢复INT,失去因子信息
  • 所以因子存储在数据帧之外的全局变量

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

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

[UPDATE:大熊猫0.15+加入对于分类体面支持 ]



Answer 2:

标签< - >水平被存储在索引对象。

  • 为一个整数数组转换为字符串数组:索引[integer_array]
  • 要转换的字符串数组为整数数组:index.get_indexer(string_array)

下面是一些exampe:

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])


文章来源: How to generate pandas DataFrame column of Categorical from string column?