2017-03-08 155 views
0

我想將DataFrame的列的dtypes初始化爲分類類型,並在其創建時指定每個列的類別。熊貓:在DataFrame構造函數中定義分類dtype

這種方式似乎不太有效,因爲我遍歷animals兩次:

col_name = pd.Categorical([a.name for a in animals], categories=['bird','cat','dog']) 
col_food = pd.Categorical([a.food for a in animals], categories=['meat','veggies']) 
df = pd.DataFrame({'Animal': col_name, 'Food': col_food}) 

這種方式似乎更有效,因爲我遍歷animals只有一次,但我怎麼能指定類別列類別?:

df = pd.DataFrame([{'Animal': a.name, 'Food': a.food} for a in animals], 
        dtype={'Animal': ???, 'Food': ???}) 

我也想避免首先創建DataFrame,然後將列的類型轉換爲分類。

喜歡的東西: dtype={'Food': dtype('category', categories=['meat','veggies]), ...}

+0

什麼是'動物'?另一個DF? – jezrael

+0

也許作品'dtype = {'Animal':「category」,'Food':「category」})' – jezrael

+0

@jezrael不,只是一個簡單的Python對象列表類對象 – Qululu

回答

0

,因爲你不把你的動物類我使用的是簡單的一個有名字和食物的屬性。

import pandas as pd 

class Animal(): 
    def __init__(self, name, food): 
     self.name = name 
     self.food = food 

cat = Animal('cat','meat') 
bird = Animal('bird', 'veggies') 
dog = Animal('dog','meat') 

animals = [cat, dog, bird, bird, dog, cat, cat, cat, dog, dog] 

df = pd.DataFrame([{'Animal': a.name, 'Food': a.food} for a in animals], dtype=(pd.Categorical)) 
print(df.Animal.cat.categories) 
print(df.Food.cat.categories) 

,輸出是:

Index(['bird', 'cat', 'dog'], dtype='object') 
Index(['meat', 'veggies'], dtype='object') 

我希望這是你在尋找的。

+0

在此解決方案中,我無法指定類別的排序。有另一種方法嗎? :-) – Qululu