2017-08-23 1 views
1

Angesichts eines Pandas df mit verschiedenen Datentypen kann df.select_dtypes sehr nützlich sein, nur gewünschte Spalten zu behalten oder unerwünschte Spalten für eine bestimmte Anwendung loszuwerden.Auswählen von String-Spalten in Pandas df (äquivalent zu df.select_dtypes)

Es gibt jedoch keine Möglichkeit string dtypes mit dieser Methode zu adressieren.

Von the docs (Hervorhebung von mir):

Valueerror
    Wenn beide ein- und ausschließen leer
    Wenn ein- und ausschließen überlappende Elemente
    Wenn jede Art von Zeichenfolge dtype wird übergeben.

und

Strings So wählen Sie das Objekt dtype verwenden müssen, aber beachten Sie, dass diese alle Objekt dtype Spalten

der Tat zurück, mit df.select_dtypes(exclude=['str']) einen Fehler auslöst (obwohl es sich um eine TypeError und nicht ein ValueError wie die Dokumente behaupten) und mit df.select_dtypes(exclude=['object']) entfernt alle object Spalten, nicht nur string Spalten.


ein df wie folgt angegeben:

df = pd.DataFrame({'int_col':[0,1,2,3,4], 
        'dict_col':[dict() for i in range(5)], 
        'str_col':list('abcde')}) 

und bedenkt, dass

df.dtypes 

ist object für beide str_col und dict_col:


Was ist die beste Art und Weise auszuschließen ist oder einschließlich aller Stränge g Spalten?

Antwort

1

Option 1

Mit df.applymap und type, und das entspricht str:

In [377]: (df.applymap(type) == str).all(0) 
Out[377]: 
dict_col False 
int_col  False 
str_col  True 
dtype: bool 

Jedes Element in jeder Spalte, um seinen Typ umgewandelt und dann zu str gleichgesetzt. Danach rufen Sie einfach .all(0) oder .min(0), um eine pro-Spalte Urteil zu erhalten.


Option 2

Mit df.applymap und isinstance:

In [342]: df.applymap(lambda x: isinstance(x, str)).all(0) 
Out[342]: 
dict_col False 
int_col  False 
str_col  True 

Um diese String-Spalten enthalten, können Sie Index für die Spalten boolean:

idx = ... # one of the two methods above 
df_new = df[df.columns[idx]] 

Ausschluss würde

df_new = df[df.columns[~idx]] 
+1

Nizza, dank sein! Der Vollständigkeit halber: Der tatsächliche Einschluss oder Ausschluss von String-Spalten könnte dann mit 'df.loc [:, (df.applymap (type) == str) .all (0)]' und 'df.loc [:, (df.applymap (type)! = str) .all (0)] '. – WhoIsJack

+1

@WhoIsJack That, oder Index für Spalten (zu meiner Antwort hinzugefügt). –