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)

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)

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 .


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']

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'])

7
kolumny datetime są innego typu, datetimeale nie są typami liczbowymi
— Jeru Luke,

15

Prosta jedna linijka:

df.select_dtypes('number').columns

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


4

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

numeric_clmns = df.dtypes[df.dtypes != "object"].index 

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)

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.


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.


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]'

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.