2017-03-08 10 views
0

Ich möchte die dtypes eines DataFrame-Spalten zu kategorialen Typen initialisieren und jede Kategorie bei seiner Erstellung angeben.Pandas: Definiere kategorischen dtype mit Kategorien im DataFrame-Konstruktor

Auf diese Weise scheint weniger effizient, weil ich eine Schleife über animals zweimal:

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}) 

Auf diese Weise effizienter scheint, weil ich eine Schleife über animals nur einmal, sondern wie kann ich die kategorischen Spalten Kategorien angeben ?:

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

Ich möchte auch vermeiden, zuerst den DataFrame zu erstellen und dann die Spalten in Kategorien umzuwandeln.

Etwas wie: dtype={'Food': dtype('category', categories=['meat','veggies]), ...}

+0

Was sind 'Tiere'? ein anderes df? – jezrael

+0

vielleicht funktioniert 'dtype = {'Tier':" Kategorie "," Essen ":" Kategorie "})' – jezrael

+0

@jezrael Nein, nur eine einfache Python-Liste der Klassenobjekte – Qululu

Antwort

0

da du dein Tier Klasse nicht verwende ich ein leicht, die Namen und Lebensmittel Attribute haben.

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) 

Und der Ausgang ist:

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

Ich hoffe, das ist das, was Sie suchen.

+0

In dieser Lösung kann ich die Reihenfolge der Kategorien jedoch nicht angeben. Gibt es eine andere Art und Weise? :-) – Qululu

Verwandte Themen