2016-10-06 4 views
2

I ha elegante Funktion haben wollen alle Objektspalten in einem Pandas Daten Rahmen KategorienPandas werfen alle Objektspalten Kategorie

df[x] = df[x].astype("category") führt der Typ df.select_dtypes(include=['object']) geworfen zu werfen würden alle Kategorien Spalten Unter auswählen. Dies führt jedoch zu einem Verlust der anderen Spalten/eine manuelle Zusammenführung ist erforderlich. Gibt es eine Lösung, die "einfach funktioniert" oder keine manuelle Bearbeitung erfordert?

bearbeiten

ich suche etwas ähnliches wie http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.convert_objects.html für eine Umstellung auf kategorische Daten

Antwort

3

Verwendung apply und pd.Series.astype mit dtype='category'

Betrachten Sie die pd.DataFramedf

df = pd.DataFrame(dict(
     A=[1, 2, 3, 4], 
     B=list('abcd'), 
     C=[2, 3, 4, 5], 
     D=list('defg') 
    )) 
df 

enter image description here

df.info() 

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 4 entries, 0 to 3 
Data columns (total 4 columns): 
A 4 non-null int64 
B 4 non-null object 
C 4 non-null int64 
D 4 non-null object 
dtypes: int64(2), object(2) 
memory usage: 200.0+ bytes 

Lets select_dtypes verwenden, um alle 'object' Typen umfassen mit einem select_dtypes zu konvertieren und rekombinieren sie auszuschließen.

df = pd.concat([ 
     df.select_dtypes([], ['object']), 
     df.select_dtypes(['object']).apply(pd.Series.astype, dtype='category') 
     ], axis=1).reindex_axis(df.columns, axis=1) 

df.info() 

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 4 entries, 0 to 3 
Data columns (total 4 columns): 
A 4 non-null int64 
B 4 non-null category 
C 4 non-null int64 
D 4 non-null category 
dtypes: category(2), int64(2) 
memory usage: 208.0 bytes 
+0

In der Tat ist dies ein guter Start. Aber ich möchte nur Objekt dtype und nicht Float oder Integer konvertieren, wie Ihre Lösung "brute-force" alles in Kategorie konvertiert –

+0

Dies: df.select_dtypes (include = ['Objekt']). Apply (pd.Series.asyphe, dtype = 'category'. info() funktioniert teilweise Alle Objekte werden konvertiert. Aber danach muss manuell eine Zusammenführung mit den numerischen Spalten durchgeführt werden. Wie kann ich dies verhindern und die dtypes an Ort und Stelle selektiv ändern –

+0

@GeorgHeiler mein Beitrag wurde aktualisiert – piRSquared

Verwandte Themen