2014-05-03 12 views
15

Pracuję przez Pythona Wesa do analizy danych, a ja natknąłem się na dziwny problem, który nie został omówiony w książce.Zmienne jakościowe w ramce danych Panda?

W poniższym kodzie, na podstawie strony 199 jego książki, tworzę ramkę danych, a następnie używam pd.cut() do utworzenia cat_obj. Według książki, cat_obj jest

„specjalny Categorical obiekt można traktować jak tablicę strun wskazujących nazwę bin;. Wewnętrznie zawiera on szereg poziomów wskazując różne nazwy kategorii wraz z etykietowania dla danych z okresu w atrybucie etykiet "

Awesome! Jeśli jednak użyję tego samego kodu pd.cut() (w [5] poniżej), aby utworzyć nową kolumnę ramki danych (o nazwie df['cat']), kolumna ta nie jest traktowana jako specjalna zmienna kategorialna , ale po prostu jako zwykła seria pand.

Jak zatem utworzyć kolumnę w ramce danych, która jest traktowana jako zmienna kategorialna?

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

wszystkie kolumny o DataFrame będą Series, jakie zachowanie szukasz że nie osiągnąć? –

+1

Rzeczy takie jak poziomy df ['cat']. Nie działają, ale cat_obj.levels ma – Anton

+1

możliwy duplikat [Jak wygenerować pandas DataFrame kolumny Kategorialnej z kolumny ciągów?] (Http://stackoverflow.com/questions/ 15356433/jak-wygenerować-pandy-ramkę-kolumny-z-kategoriami-z-kolumny-kolumny) –

Odpowiedz

0

Teraz nie można mieć kategorycznych dane w szereg obiektów lub DataFrame, ale ta funkcjonalność będzie realizowany w Pandas 0.15 (z powodu we wrześniu).

1

To może się dziać z powodu tego rodzaju zachowań setter-:

getter Sample i 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'> 

Na razie df akceptuje tylko Series data i jego seter konwertuje Categorial data do Series. df Obsługa kategorii jest wymagana w następnej wersji Pandy.

+1

To wyjaśnia dziwne zachowanie, Dzięki. – rajat

0

Od http://pandas-docs.github.io/pandas-docs-travis/categorical.html, od pand 0,15 począwszy

Określ dtype = "kategorię" przy konstruowaniu Seria:

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] 

Następnie można dodać do istniejącej serii.

lub przekonwertować istniejący szeregowo lub kolumnę do kategorii 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 
Powiązane problemy