2014-05-03 2 views
15

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

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

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

Удивительный! Однако, если я использую тот же самый код pd.cut() (в [5] ниже), чтобы создать новый столбец кадра данных (называемый df['cat']), эта колонка не рассматривается как специальная категориальная переменная , а просто как обычная серия панд.

Как же создать столбец в кадре данных, который рассматривается как категориальная переменная?

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 
+2

все столбцы DataFrame будут серии, какое поведение вы ищете, что это не достижение? –

+1

Такие вещи, как уровни df ['cat'], не работают, но cat_obj.levels делает – Anton

+1

возможный дубликат [Как создать столбец данных Pandas DataFrame из категориального столбца строки?] (Http://stackoverflow.com/questions/ 15356433/how-to-generate-pandas-dataframe-column-of-category-from-string-column) –

ответ

0

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

1

Это может происходить из-за такого рода поведения setter-:

Образец добытчика и 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 должна быть включена категориальная поддержка.

+1

Это объясняет странное поведение, спасибо. – rajat

0

От http://pandas-docs.github.io/pandas-docs-travis/categorical.html, от панда 0,15 года

Укажите DTYPE = "категорию" при построении серии:

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 
Смежные вопросы