Skip to content

pandas: Extrahieren von Spalten aus pandas.DataFrame basierend auf dtype

Python

pandas.DataFrame hat für jede Spalte den Datentyp dtype.

Um nur Spalten mit einem bestimmten dtype zu extrahieren, verwenden SIE die Methode select_dtypes() von pandas.DataFrame.

Dieser Artikel hat folgenden Inhalt.

  • Grundlegende Verwendung von select_dtypes()
    • Geben Sie den zu extrahierenden Typ an:include
    • Geben Sie den lokalen dtype an:exclude

Siehe den following Artikel für den Datentyp dtype und die Methode astype().

Verwenden Sie als Beispiel den following pandas.DataFrame mit Spalten verschiedener Datentypen.

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3],
                   'b': [0.1, 0.2, 0.3],
                   'c': ['X', 'Y', 'Z'],
                   'd': [[0, 0], [1, 1], [2, 2]],
                   'e': [True, True, False]})

df['f'] = pd.to_datetime(['2018-01-01', '2018-02-01', '2018-03-01'])

print(df)
#    a    b  c       d      e          f
# 0  1  0.1  X  [0, 0]   True 2018-01-01
# 1  2  0.2  Y  [1, 1]   True 2018-02-01
# 2  3  0.3  Z  [2, 2]  False 2018-03-01

print(df.dtypes)
# a             int64
# b           float64
# c            object
# d            object
# e              bool
# f    datetime64[ns]
# dtype: object

Grundlegende Verwendung von select_dtypes()

Geben Sie den zu extrahierenden dtype mit dem include-Parameter an.

print(df.select_dtypes(include=int))
#    a
# 0  1
# 1  2
# 2  3

Eingebaute Python-Typen wie int und float können unverändert angegeben werden. Sie können es auch als Zeichenfolge wie „int“ angeben. Es kann auch wie ‚int64‘ sein, stark einschließlich der Anzahl der Bits.

print(df.select_dtypes(include='int'))
#    a
# 0  1
# 1  2
# 2  3

print(df.select_dtypes(include='int64'))
#    a
# 0  1
# 1  2
# 2  3

Wenn die Anzahl der Bits enthalten ist, wird sie natürlich nicht ausgewählt, es sei denn, die Anzahl der Bits stimmt überein.

print(df.select_dtypes(include='int32'))
# Empty DataFrame
# Columns: []
# Index: [0, 1, 2]

Mehrere Typen können mit einer Liste angegeben werden. datetime64[ns] kann mit ‚datetime‘ angegeben werden.

print(df.select_dtypes(include=[float, bool, 'datetime']))
#      b      e          f
# 0  0.1   True 2018-01-01
# 1  0.2   True 2018-02-01
# 2  0.3  False 2018-03-01

Numerische Typen wie int und float can zusammen with ’number‘ angegeben Werden.

print(df.select_dtypes(include='number'))
#    a    b
# 0  1  0.1
# 1  2  0.2
# 2  3  0.3

Da der dtype einer Spalte, deren Elemente str sind, Objekt ist, WIRD ein Fehler ausgelöst, wenn str oder ’str‘ angegeben wird.

# print(df.select_dtypes(include=str))
# TypeError: string dtypes are not allowed, use 'object' instead

Der dtype einer Spalte, deren Elemente eingebaute Python-Standardtypen wie list und dict sind, ist ebenfalls object. Beachten Sie, dass diese Spalten ebenfalls ausgewählt werden, WENN SIE ein Objekt angeben.

print(df.select_dtypes(include=object))
#    c       d
# 0  X  [0, 0]
# 1  Y  [1, 1]
# 2  Z  [2, 2]

print(type(df.at[0, 'c']))
# <class 'str'>

print(type(df.at[0, 'd']))
# <class 'list'>

Möglicherweise & Sie sich darüber keine allzu großen Gedanken machen, da andere Objekte als str wahrscheinlich keine Elemente von pandas. DataFrame sind, es sei denn, Sie handhaben es absichtlich.

Geben Sie den lokalen dtype an:exclude

Geben Sie den öffentlichen Datentyp mit dem Exclude-Parameter an.

Mehrere Typen können mit einer Liste angegeben werden.

print(df.select_dtypes(exclude='number'))
#    c       d      e          f
# 0  X  [0, 0]   True 2018-01-01
# 1  Y  [1, 1]   True 2018-02-01
# 2  Z  [2, 2]  False 2018-03-01

print(df.select_dtypes(exclude=[bool, 'datetime']))
#    a    b  c       d
# 0  1  0.1  X  [0, 0]
# 1  2  0.2  Y  [1, 1]
# 2  3  0.3  Z  [2, 2]

Einschließen und Ausschließen can gleichzeitig angegeben Werden, es WIRD jedoch EIN Fehler ausgelöst, WENN für beide derselbe Typ angegeben WIRD.

print(df.select_dtypes(include='number', exclude=int))
#      b
# 0  0.1
# 1  0.2
# 2  0.3

# print(df.select_dtypes(include=[int, bool], exclude=int))
# ValueError: include and exclude overlap on frozenset({<class 'numpy.int64'>})