Ich muss verschiedene Funktionen verwenden, um numerische Spalten und Zeichenfolgenspalten zu behandeln. Was ich jetzt mache, ist wirklich dumm:
allc = list((agg.loc[:, (agg.dtypes==np.float64)|(agg.dtypes==np.int)]).columns)
for y in allc:
treat_numeric(agg[y])
allc = list((agg.loc[:, (agg.dtypes!=np.float64)&(agg.dtypes!=np.int)]).columns)
for y in allc:
treat_str(agg[y])
Gibt es eine elegantere Möglichkeit, dies zu tun? Z.B
for y in agg.columns:
if(dtype(agg[y]) == 'string'):
treat_str(agg[y])
elif(dtype(agg[y]) != 'string'):
treat_numeric(agg[y])
string
ist kein dtypeAntworten:
Sie können auf den Datentyp einer Spalte zugreifen mit
dtype
:quelle
treat_numeric
Funktion verwendet werden soll. Da eragg.dtypes==np.float64
als Option aufgenommen hat, habe ich es auch getan.number
hier unter : docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html Die allgemeine Lösung lautetis_numeric_dtype(agg[y])
In können
pandas 0.20.2
Sie tun:So wird Ihr Code:
quelle
pandas.core.common.is_numeric_dtype
existiert seit Pandas 0.13, und es macht das gleiche, aber es wurde zugunsten vonpandas.api.types.is_numeric_dtype
Ich weiß, dass dies ein alter Thread ist, aber mit Pandas 19.02 können Sie Folgendes tun:
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.select_dtypes.html
quelle
include[np.number]
(um auch Ints und 32-Bit-Floats einzuschließen) für die erste Zeile undexclude[object]
für die zweite Zeile. Strings sind Objekte für dtypes. Tatsächlich gibt mir das Einfügen von 'string' in object einen Fehler.'period'
dtype vorerst erhöhtNotImplementedError
(pandas 0.24.2). Man muss also vielleicht eine handgemachte Nachbearbeitung brauchen.Der Titel der gestellten Frage ist allgemein, aber der im Hauptteil der Frage angegebene Anwendungsfall der Autoren ist spezifisch. Es können also auch andere Antworten verwendet werden.
Aber um in vollem Umfang die Antwort Titelfrage sollte klargestellt werden , dass es scheint , als ob alle Ansätze können nicht in einigen Fällen und einig Nacharbeit erfordern. Ich habe alle (und einige zusätzliche) in abnehmender Reihenfolge der Zuverlässigkeit überprüft (meiner Meinung nach):
1. Typen direkt über vergleichen
==
(akzeptierte Antwort).Trotz der Tatsache, dass dies eine akzeptierte Antwort ist und die meisten Upvotes zählen, denke ich, dass diese Methode überhaupt nicht angewendet werden sollte. Weil in der Tat von diesem Ansatz in Python abgeraten wird, wie hier mehrmals erwähnt .
Aber wenn man sich noch verwenden mag - soll wie von einigen Pandas spezifischen dtypes darüber im Klaren sein
pd.CategoricalDType
,pd.PeriodDtype
oderpd.IntervalDtype
. Hier muss man extratype( )
verwenden, um dtype richtig zu erkennen:Eine weitere Einschränkung ist, dass der Typ genau hervorgehoben werden sollte:
2.
isinstance()
Ansatz.Diese Methode wurde bisher in den Antworten nicht erwähnt.
Wenn ein direkter Vergleich von Typen keine gute Idee ist, können Sie zu diesem Zweck die integrierte Python-Funktion ausprobieren, nämlich -
isinstance()
.Es schlägt nur am Anfang fehl, da davon ausgegangen wird, dass wir einige Objekte haben, aber
pd.Series
oderpd.DataFrame
nur als leere Container mit vordefinierten,dtype
aber keinen Objekten darin verwendet werden können:Aber wenn man dieses Problem irgendwie überwindet und auf jedes Objekt zugreifen möchte, zum Beispiel in der ersten Zeile, und seinen dtype wie folgt überprüft:
Bei gemischten Datentypen in einer Spalte ist dies irreführend:
Und last but not least - diese Methode kann
Category
dtype nicht direkt erkennen . Wie in den Dokumenten angegeben :Diese Methode ist also auch fast nicht anwendbar.
3.
df.dtype.kind
Ansatz.Diese Methode funktioniert möglicherweise noch mit leer
pd.Series
oder hatpd.DataFrames
aber andere Probleme.Erstens - es kann einige d-Typen nicht unterscheiden:
Zweitens, was für mich eigentlich noch unklar ist, gibt es sogar bei einigen dtypes None zurück .
4.
df.select_dtypes
Ansatz.Das ist fast das, was wir wollen. Diese Methode wurde in Pandas entwickelt, um die meisten zuvor erwähnten Eckfälle zu behandeln - leere DataFrames, unterscheidet sich gut von numpy- oder pandas-spezifischen dtypes. Es funktioniert gut mit einzelnen dtype wie
.select_dtypes('bool')
. Es kann sogar zum Auswählen von Spaltengruppen basierend auf dtype verwendet werden:Wie in den Dokumenten angegeben :
Man könnte denken, dass wir hier erste unerwartete (für mich früher: Frage ) Ergebnisse sehen -
TimeDelta
sind in der Ausgabe enthaltenDataFrame
. Aber wie im Gegenteil beantwortet , sollte es so sein, aber man muss sich dessen bewusst sein. Beachten Sie, dassbool
dtype übersprungen wird, was für jemanden möglicherweise auch unerwünscht ist, aber auf verschiedene " Teilbäume " von numpy dtypes zurückzuführen istbool
undnumber
sich in diesen befindet. Im Falle von Bool können wir hier verwenden.test.select_dtypes(['bool'])
Die nächste Einschränkung dieser Methode besteht darin, dass für die aktuelle Version von Pandas (0.24.2) dieser Code: ausgelöst
test.select_dtypes('period')
wirdNotImplementedError
.Und eine andere Sache ist, dass es nicht möglich ist, Zeichenfolgen von anderen Objekten zu unterscheiden:
Aber das ist erstens - bereits erwähnt in der Dokumentation. Und zweitens - ist nicht das Problem dieser Methode, sondern die Art und Weise, wie Zeichenfolgen gespeichert werden
DataFrame
. Aber trotzdem muss dieser Fall eine Nachbearbeitung haben.5.
df.api.types.is_XXX_dtype
Ansatz.Dieser soll der robusteste und nativste Weg sein, um eine dtype-Erkennung zu erreichen (der Pfad des Moduls, in dem sich die Funktionen befinden, sagt von selbst), wie ich vermute. Und es funktioniert fast perfekt, hat aber immer noch mindestens eine Einschränkung und muss trotzdem irgendwie String-Spalten unterscheiden .
Außerdem mag dies subjektiv sein, aber dieser Ansatz hat auch eine "vom Menschen verständliche"
number
Verarbeitung von dtypes-Gruppen im Vergleich zu.select_dtypes('number')
:Nein
timedelta
undbool
ist enthalten. Perfekt.Meine Pipeline nutzt zu diesem Zeitpunkt genau diese Funktionalität sowie ein wenig Nachbearbeitung.
Ausgabe.
Ich hoffe, ich konnte den Hauptpunkt argumentieren - dass alle diskutierten Ansätze verwendet werden können, aber nur
pd.DataFrame.select_dtypes()
undpd.api.types.is_XXX_dtype
wirklich als die anwendbaren betrachtet werden sollten.quelle
Wenn Sie den Typ einer Datenrahmenspalte als Zeichenfolge markieren möchten, haben Sie folgende Möglichkeiten:
Ein Beispiel:
Die Antwort für Ihren Code:
quelle
Zum hübschen Drucken der Spaltendatentypen
So überprüfen Sie die Datentypen beispielsweise nach einem Import aus einer Datei
Illustrative Ausgabe:
quelle