Категориальные переменные в Pandas Dataframe?

Я работаю через Wes Python для анализа данных, и у меня возникла странная проблема, которая не рассматривается в книге.

В приведенном ниже коде, основываясь на стр. 199 его книги, я создаю dataframe, а затем pd.cut() создаю cat_obj. Согласно книге, cat_obj есть

"специальный категориальный объект. Вы можете рассматривать его как массив строки, указывающие имя бина; внутри он содержит массив уровней указывая названия отдельных категорий вместе с маркировкой для возрастает в атрибуте меток"

Awesome! Однако, если я использую тот же самый код 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

Ответ 1

Это может происходить из-за такого поведения 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 data в Series. df категориальная поддержка должна появиться в следующем выпуске Pandas.

Ответ 2

В настоящий момент вы не можете иметь категориальные данные в объекте Series или DataFrame, но эта функциональность будет реализована в Pandas 0.15 (ожидается в сентябре).

Ответ 3

От http://pandas-docs.github.io/pandas-docs-travis/categorical.html, от pandas 0,15 вперед

Задайте 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