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.