Jak znaleźć kolumny liczbowe w Pandach?

121

Powiedzmy, że dfjest to DataFrame pandy. Chciałbym znaleźć wszystkie kolumny typu liczbowego. Coś jak:

isNumeric = is_numeric(df)
Hanan Shteingart
źródło
Należy określić, czy dana kolumna, która dtypejest object, ale wszystkie elementy są numeryczne, liczy się jako numeryczny czy nie. Jeśli nie, weź odpowiedź Hanan, ponieważ jest ona również szybsza. W przeciwnym razie weź moje.
FooBar
Co się stanie, jeśli po prostu wypróbujesz kolumny df.describe (). Następnie przypisz go do zmiennej.
coldy

Odpowiedzi:

146

Możesz użyć select_dtypesmetody DataFrame. Obejmuje dwa parametry obejmują i wyklucza. Więc isNumeric wyglądałoby tak:

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

newdf = df.select_dtypes(include=numerics)
Anand
źródło
94
Możesz użyć df.select_dtypes (include = [np.number]), jeśli nie musisz określać listy „
numerycznej
23
Opierając się na wskazówce w poprzednim komentarzu (+1), możesz po prostu użyć list(df.select_dtypes(include=[np.number]).columns.values) do uzyskania listy nazw kolumn liczbowych
user799188
76

Możesz użyć nieudokumentowanej funkcji _get_numeric_data()do filtrowania tylko kolumn liczbowych:

df._get_numeric_data()

Przykład:

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

Należy zauważyć, że jest to „metoda prywatna” (tj. Szczegół implementacji) i może w przyszłości ulec zmianie lub całkowitemu usunięciu. Używaj ostrożnie .

Kathirmani Sukumar
źródło
1
Super poręczny; czy to jest gdzieś udokumentowane? Obawiam się, że zniknie w przyszłych wersjach i / lub niestabilność, ponieważ podkreślenie przedrostka wskazuje, że ma być prywatny.
ijoseph,
3
Nie, to nie jest nigdzie udokumentowane. Implementacja jest tutaj , jednak jak wspomniał @ijoseph, byłbym ostrożny przy używaniu metod zaczynających się od podkreślenia, ponieważ są one niewiele więcej niż szczegółami implementacji. Użyj dosłownie KAŻDEJ innej odpowiedzi poza tym.
cs95
Dokładnie. Jako najlepszą praktykę staram się używać i konwertować na jak najwięcej metod numpy. Wynika to z dynamizmu pand. Interfejs API często się zmienia. W przypadku metod nieudokumentowanych jest to po prostu lekkomyślne, bez względu na to, jak przydatne jest.
mik
69

Prosta jednowierszowa odpowiedź, aby utworzyć nową ramkę danych z tylko kolumnami liczbowymi:

df.select_dtypes(include=np.number)

Jeśli chcesz nazwy kolumn numerycznych:

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

Kompletny kod:

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
źródło
2
df.select_dtypes(include=['int64']).columns.tolist()
Cherry Wu,
Jeśli chcesz tylko jeden typ, nie musisz przechowywać go na liście. Nie musisz też określać include=. select_dtypes(np.number)
BallpointBen
Jeśli kolumny zawierają dane liczbowe, ale mają również wartość Brak, typ dtype może mieć wartość „obiekt”. To zmusi kolumny do wartości liczbowych:df.fillna(value=0, inplace=True)
vaughnkoch
26
df.select_dtypes(exclude=['object'])
BEN_YO
źródło
7
kolumny datetime są innego typu, datetimeale nie są typami liczbowymi
Jeru Luke,
15

Prosta jedna linijka:

df.select_dtypes('number').columns
zwinny
źródło
2
Zdecydowanie najbardziej Pythonowy sposób, tak.
jorijnsmit
6

Poniższe kody spowodują zwrócenie listy nazw kolumn liczbowych zestawu danych.

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

oto marketing_trainmój zestaw danych i select_dtypes()służy do wybierania typów danych za pomocą wykluczania i dołączania argumentów i kolumn służy do pobierania nazwy kolumny zestawu danych wyjście powyższego kodu będzie następujące:

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

Dzięki

Hukmaram
źródło
4

To kolejny prosty kod do znajdowania kolumny numerycznej w ramce danych pandy,

numeric_clmns = df.dtypes[df.dtypes != "object"].index 
Anvesh_vs
źródło
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
źródło
1

Dostosowując tę odpowiedź , możesz to zrobić

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

Tutaj np.applymap(np.isreal)pokazuje, czy każda komórka w ramce danych jest numeryczna i .axis(all=0)sprawdza, czy wszystkie wartości w kolumnie mają wartość Prawda i zwraca serię wartości logicznych, których można użyć do indeksowania żądanych kolumn.

Garrett
źródło
1

Zobacz poniższy kod:

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())

W ten sposób możesz sprawdzić, czy wartości są numeryczne, takie jak float i int lub srting. druga instrukcja if służy do sprawdzania wartości łańcuchowych, do których odwołuje się obiekt.

mickey
źródło
1

Możemy uwzględniać i wykluczać typy danych zgodnie z poniższym wymaganiem:

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

Skierowany z Jupyter Notebook.

Aby wybrać wszystkie typy liczbowe , użyj np.numberlub'number'

  • Aby wybrać łańcuchy, musisz użyć objectdtype, ale zwróć uwagę, że zwróci to wszystkie kolumny obiektu dtype

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

  • Aby wybrać datetimes, stosowanie np.datetime64, 'datetime'lub 'datetime64'

  • Aby wybrać timedeltas, stosowanie np.timedelta64, 'timedelta'lub 'timedelta64'

  • Aby wybrać dtypy jakościowe Pandas, użyj 'category'

  • Aby wybrać typy datetimetz Pandas, użyj 'datetimetz'(nowość w 0.20.0) lub `` 'datetime64 [ns, tz]'

Muralitharan Sathyamoorthy
źródło