16

我正在研究 Wes 的 Python For Data Analysis,我遇到了一个书中没有解决的奇怪问题。

在下面的代码中,基于他的书的第 199 页,我创建了一个数据框,然后使用它pd.cut()来创建cat_obj. 根据书,cat_obj

“一个特殊的 Categorical 对象。您可以将其视为指示 bin 名称的字符串数组;在内部它包含指示不同类别名称的级别数组以及标签属性中年龄数据的标签”

惊人的!但是,如果我使用完全相同的pd.cut()代码(在下面的 [5] 中)创建数据框的新列(称为df['cat']),则该列不会被视为特殊的分类变量,而只是作为常规的 pandas 系列。

那么,如何在数据框中创建一个被视为分类变量的列?

In [4]:

import pandas as pd

raw_data = {'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
        'score': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]}
df = pd.DataFrame(raw_data, columns = ['name', 'score'])

bins = [0, 25, 50, 75, 100]
group_names = ['Low', 'Okay', 'Good', 'Great']

In [5]:
cat_obj = pd.cut(df['score'], bins, labels=group_names)
df['cat'] = pd.cut(df['score'], bins, labels=group_names)
In [7]:

type(cat_obj)
Out[7]:
pandas.core.categorical.Categorical
In [8]:

type(df['cat'])
Out[8]:
pandas.core.series.Series
4

3 回答 3

1

由于 setter- 的这种行为,可能会发生这种情况:

示例 getter 和 setter-

class a:
    x = 1
    @property
    def p(self):
        return int(self.x)

    @p.setter
    def p(self,v):
        self.x = v
t = 1.32
a().p = 1.32


print type(t) --> <type 'float'>
print type(a().p) --> <type 'int'>

现在df只接受Series data并且它的设置器转换Categorial dataSeries. dfNext Pandas 版本将提供分类支持。

于 2014-08-07T16:25:49.467 回答
0

目前,您不能在 Series 或 DataFrame 对象中包含分类数据,但此功能将在Pandas 0.15(将于 9 月到期)中实现。

于 2014-08-07T15:57:42.133 回答
0

http://pandas-docs.github.io/pandas-docs-travis/categorical.html从 pandas 0.15 开始

构造 Series 时指定 dtype="category":

In [1]: s = pd.Series(["a","b","c","a"], dtype="category")

In [2]: s
Out[2]: 
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]

然后,您可以将其添加到现有系列中。

或者将现有的系列或列转换为类别 dtype:

In [3]: df = pd.DataFrame({"A":["a","b","c","a"]})

In [4]: df["B"] = df["A"].astype('category')

In [5]: df
Out[5]: 
   A  B
0  a  a
1  b  b
2  c  c
3  a  a
于 2015-11-16T12:15:31.457 回答