Wie finde ich numerische Spalten in Pandas?

120

dfAngenommen , es handelt sich um einen Pandas DataFrame. Ich möchte alle Spalten vom numerischen Typ finden. Etwas wie:

isNumeric = is_numeric(df)
Hanan Shteingart
quelle
Sie sollten angeben, ob eine Spalte, die vorhanden dtypeist object, aber alle Elemente numerisch sind, als numerisch gilt oder nicht. Wenn nein, nimm Hanans Antwort, da sie auch schneller ist. Ansonsten nimm meine.
FooBar
Was passiert, wenn Sie einfach df.describe (). Columns ausprobieren? Ordnen Sie es dann einer Variablen zu.
kalt

Antworten:

146

Sie können die select_dtypesMethode von DataFrame verwenden. Es enthält zwei Parameter einschließen und ausschließen. IsNumeric würde also so aussehen:

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']

newdf = df.select_dtypes(include=numerics)
Anand
quelle
94
Sie können df.select_dtypes (include = [np.number]) verwenden, wenn Sie keine '
numerische
23
Aufbauend auf dem Tipp im vorherigen Kommentar (+1) können Sie einfach list(df.select_dtypes(include=[np.number]).columns.values) eine Liste der Namen der numerischen Spalten
abrufen
76

Mit der Funktion ohne _get_numeric_data()Papiere können Sie nur numerische Spalten filtern:

df._get_numeric_data()

Beispiel:

In [32]: data
Out[32]:
   A  B
0  1  s
1  2  s
2  3  s
3  4  s

In [33]: data._get_numeric_data()
Out[33]:
   A
0  1
1  2
2  3
3  4

Beachten Sie, dass dies eine "private Methode" (dh ein Implementierungsdetail) ist und in Zukunft geändert oder vollständig entfernt werden kann. Mit Vorsicht verwenden .

Kathirmani Sukumar
quelle
1
Super praktisch; ist das irgendwo dokumentiert? Besorgt darüber, dass es in zukünftigen Versionen und / oder Instabilität verschwindet, da sein Präfix-Unterstrich anzeigt, dass es privat sein soll.
Ijoseph
3
Nein, das ist nirgendwo dokumentiert. Die Implementierung ist hier , wie bei @ijoseph erwähnt, würde ich jedoch vorsichtig sein, Methoden zu verwenden, die mit Unterstrichen beginnen, da sie kaum mehr als Implementierungsdetails sind. Verwenden Sie buchstäblich JEDE andere Antwort als diese.
CS95
Genau. Als Best Practice versuche ich, so viele Numpy-Methoden wie möglich zu verwenden und zu konvertieren. Dies ist auf die Dynamik der Pandas zurückzuführen. Die API ändert sich häufig. Für undokumentierte Methoden ist es einfach rücksichtslos, egal wie nützlich es ist.
Mik
69

Einfache einzeilige Antwort zum Erstellen eines neuen Datenrahmens mit nur numerischen Spalten:

df.select_dtypes(include=np.number)

Wenn Sie die Namen numerischer Spalten möchten:

df.select_dtypes(include=np.number).columns.tolist()

Vollständiger Code:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': range(7, 10),
                   'B': np.random.rand(3),
                   'C': ['foo','bar','baz'],
                   'D': ['who','what','when']})
df
#    A         B    C     D
# 0  7  0.704021  foo   who
# 1  8  0.264025  bar  what
# 2  9  0.230671  baz  when

df_numerics_only = df.select_dtypes(include=np.number)
df_numerics_only
#    A         B
# 0  7  0.704021
# 1  8  0.264025
# 2  9  0.230671

colnames_numerics_only = df.select_dtypes(include=np.number).columns.tolist()
colnames_numerics_only
# ['A', 'B']
stackoverflowuser2010
quelle
2
df.select_dtypes(include=['int64']).columns.tolist()
Cherry Wu
Wenn Sie nur einen Typ möchten, müssen Sie ihn nicht in einer Liste speichern. Sie müssen auch nicht angeben include=. select_dtypes(np.number)
BallpointBen
Wenn Ihre Spalten numerische Daten enthalten, aber auch keine, kann der d-Typ "Objekt" sein. Dies wird die Spalten zu numerischen zwingen:df.fillna(value=0, inplace=True)
Vaughnkoch
26
df.select_dtypes(exclude=['object'])
YOBEN_S
quelle
7
datetime Spalten sind ein anderer Typ, sie datetimesind keine numerischen Typen
Jeru Luke
15

Einfacher Einzeiler:

df.select_dtypes('number').columns
flink
quelle
2
Bei weitem der pythonischste Weg, ja.
jorijnsmit
5

Die folgenden Codes geben eine Liste der Namen der numerischen Spalten eines Datensatzes zurück.

cnames=list(marketing_train.select_dtypes(exclude=['object']).columns)

Hier marketing_trainist mein Datensatz und select_dtypes()die Funktion zum Auswählen von Datentypen mithilfe von Ausschluss- und Einschlussargumenten und Spalten zum Abrufen des Spaltennamens des Datensatzes. Die Ausgabe des obigen Codes lautet wie folgt:

['custAge',
     'campaign',
     'pdays',
     'previous',
     'emp.var.rate',
     'cons.price.idx',
     'cons.conf.idx',
     'euribor3m',
     'nr.employed',
     'pmonths',
     'pastEmail']

Vielen Dank

Hukmaram
quelle
4

Dies ist ein weiterer einfacher Code zum Auffinden einer numerischen Spalte im Pandas-Datenrahmen.

numeric_clmns = df.dtypes[df.dtypes != "object"].index 
Anvesh_vs
quelle
1
def is_type(df, baseType):
    import numpy as np
    import pandas as pd
    test = [issubclass(np.dtype(d).type, baseType) for d in df.dtypes]
    return pd.DataFrame(data = test, index = df.columns, columns = ["test"])
def is_float(df):
    import numpy as np
    return is_type(df, np.float)
def is_number(df):
    import numpy as np
    return is_type(df, np.number)
def is_integer(df):
    import numpy as np
    return is_type(df, np.integer)
Hanan Shteingart
quelle
1

Wenn Sie diese Antwort anpassen , können Sie dies tun

df.ix[:,df.applymap(np.isreal).all(axis=0)]

Hier wird angezeigt, np.applymap(np.isreal)ob jede Zelle im .axis(all=0)Datenrahmen numerisch ist, und es wird geprüft, ob alle Werte in einer Spalte True sind, und es wird eine Reihe von Booleschen Werten zurückgegeben, mit denen die gewünschten Spalten indiziert werden können.

Garrett
quelle
1

Bitte beachten Sie den folgenden Code:

if(dataset.select_dtypes(include=[np.number]).shape[1] > 0):
display(dataset.select_dtypes(include=[np.number]).describe())
if(dataset.select_dtypes(include=[np.object]).shape[1] > 0):
display(dataset.select_dtypes(include=[np.object]).describe())

Auf diese Weise können Sie überprüfen, ob die Werte numerisch sind, z. B. float und int oder die srting-Werte. Die zweite if-Anweisung wird zum Überprüfen der Zeichenfolgenwerte verwendet, auf die das Objekt verweist.

mickey
quelle
1

Wir können Datentypen gemäß der folgenden Anforderung ein- und ausschließen:

train.select_dtypes(include=None, exclude=None)
train.select_dtypes(include='number') #will include all the numeric types

Weitergeleitet von Jupyter Notebook.

Verwenden Sie oder, um alle numerischen Typen auszuwählennp.number'number'

  • Um Zeichenfolgen auszuwählen, müssen Sie den objectdtype verwenden. Beachten Sie jedoch, dass dadurch alle dtype-Objektspalten zurückgegeben werden

  • Siehe NumPy dtype hierarchy <http://docs.scipy.org/doc/numpy/reference/arrays.scalars.html>__

  • So wählen Sie Datetimes, Verwendung np.datetime64, 'datetime'oder 'datetime64'

  • So wählen Sie timedeltas, Verwendung np.timedelta64, 'timedelta'oder 'timedelta64'

  • Verwenden Sie zur Auswahl von Pandas kategorialen dtypes 'category'

  • Verwenden Sie 'datetimetz'(neu in 0.20.0) oder `` 'datetime64 [ns, tz]', um Pandas datetimetz dtypes auszuwählen.

Muralitharan Sathyamoorthy
quelle