Potrzebuję różnych funkcji do traktowania kolumn numerycznych i kolumn z ciągami. To, co teraz robię, jest naprawdę głupie:
allc = list((agg.loc[:, (agg.dtypes==np.float64)|(agg.dtypes==np.int)]).columns)
for y in allc:
treat_numeric(agg[y])
allc = list((agg.loc[:, (agg.dtypes!=np.float64)&(agg.dtypes!=np.int)]).columns)
for y in allc:
treat_str(agg[y])
Czy jest na to bardziej elegancki sposób? Na przykład
for y in agg.columns:
if(dtype(agg[y]) == 'string'):
treat_str(agg[y])
elif(dtype(agg[y]) != 'string'):
treat_numeric(agg[y])
string
nie jest typemOdpowiedzi:
Możesz uzyskać dostęp do typu danych kolumny za pomocą
dtype
:źródło
treat_numeric
funkcji. Ponieważ włączyłagg.dtypes==np.float64
jako opcję, ja też to zrobiłem.number
: docs.scipy.org/doc/numpy-1.13.0/reference/arrays.scalars.html Ogólne rozwiązanie tois_numeric_dtype(agg[y])
W
pandas 0.20.2
możesz zrobić:Twój kod staje się więc:
źródło
pandas.core.common.is_numeric_dtype
istnieje od wersji 0.13 Pandy i robi to samo, ale został wycofany na korzyść wersjipandas.api.types.is_numeric_dtype
0.19, jak sądzęWiem, że to trochę stary wątek, ale z pandami 19.02 możesz zrobić:
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.select_dtypes.html
źródło
include[np.number]
(włączając również liczby int i 32-bitowe zmiennoprzecinkowe) dla pierwszej linii iexclude[object]
drugiej linii. Łańcuchy są obiektami, jeśli chodzi o typy. W rzeczywistości dołączenie „string” do obiektu powoduje błąd.'period'
dtype podnosiNotImplementedError
teraz (pandy 0.24.2). Więc może być potrzebne ręczne przetwarzanie końcowe.Tytuł zadawanego pytania jest ogólny, ale przypadek użycia przez autorów podany w treści pytania jest specyficzny. Można więc użyć innych odpowiedzi.
Aby jednak w pełni odpowiedzieć na tytułowe pytanie , należy wyjaśnić, że wydaje się, że wszystkie podejścia mogą w niektórych przypadkach zawodzić i wymagać pewnych poprawek. Przejrzałem je wszystkie (i kilka dodatkowych) w kolejności malejącej wiarygodności (moim zdaniem):
1. Porównywanie typów bezpośrednio przez
==
(zaakceptowana odpowiedź).Pomimo tego, że jest to akceptowana odpowiedź i ma najwięcej głosów pozytywnych, myślę, że ta metoda w ogóle nie powinna być stosowana. Ponieważ w rzeczywistości takie podejście jest odradzane w Pythonie, jak kilkakrotnie wspomniano tutaj .
Ale jeśli nadal chcesz go używać - powinni być świadomi pewnych specyficznych dtypes pandy jak
pd.CategoricalDType
,pd.PeriodDtype
lubpd.IntervalDtype
. Tutaj trzeba użyć extratype( )
, aby poprawnie rozpoznać dtype:Kolejnym zastrzeżeniem jest to, że należy dokładnie wskazać ten typ:
2.
isinstance()
podejście.Do tej pory nie wspomniano o tej metodzie w odpowiedziach.
Jeśli więc bezpośrednie porównywanie typów nie jest dobrym pomysłem - wypróbujmy w tym celu wbudowaną funkcję Pythona, a mianowicie -
isinstance()
.To zawodzi dopiero na początku, ponieważ zakłada, że mamy jakieś obiekty, ale
pd.Series
lubpd.DataFrame
mogą być używane jako puste pojemniki z predefiniowanymi,dtype
ale bez obiektów:Ale jeśli ktoś w jakiś sposób przezwycięży ten problem i chce uzyskać dostęp do każdego obiektu, na przykład w pierwszym rzędzie i sprawdza jego typ w ten sposób:
Będzie to mylące w przypadku mieszanego rodzaju danych w jednej kolumnie:
I wreszcie - ta metoda nie może bezpośrednio rozpoznać typu
Category
. Jak stwierdzono w dokumentach :Więc ta metoda jest również prawie nie do zastosowania.
3.
df.dtype.kind
podejście.Ta metoda może jednak działać z pustą
pd.Series
lubpd.DataFrames
ma inne problemy.Po pierwsze - nie jest w stanie rozróżnić niektórych typów:
Po drugie, co właściwie nadal jest dla mnie niejasne, powraca nawet w niektórych typach Brak .
4.
df.select_dtypes
podejście.To jest prawie to, czego chcemy. Ta metoda została zaprojektowana w pandach, więc obsługuje większość wspomnianych wcześniej przypadków narożnych - puste ramki DataFrames, dobrze różni dtypy specyficzne dla numpy lub pandy. Działa dobrze z pojedynczym typem, takim jak
.select_dtypes('bool')
. Może służyć nawet do wybierania grup kolumn na podstawie dtype:W ten sposób, jak stwierdzono w dokumentach :
Można pomyśleć, że tutaj widzimy pierwsze nieoczekiwane (jak dla mnie było: pytanie ) wyniki -
TimeDelta
są uwzględniane w wynikachDataFrame
. Ale jak odpowiedziałem przeciwnie, powinno tak być, ale trzeba być tego świadomym. Zauważ, żebool
dtype jest pomijany, co może być również niepożądane dla kogoś, ale jest to spowodowanebool
inumber
znajduje się w różnych „ poddrzewach ” numpy dtypes. W przypadku bool możemy użyćtest.select_dtypes(['bool'])
tutaj.Następnym ograniczeniem tej metody jest to, że dla aktualnej wersji pand (0.24.2) ten kod:
test.select_dtypes('period')
podniesieNotImplementedError
.Inną rzeczą jest to, że nie jest w stanie odróżnić ciągów od innych obiektów:
Ale to jest po pierwsze - już wspomniane w dokumentacji. Po drugie - to nie problem tej metody, a raczej sposób, w jaki przechowywane są łańcuchy
DataFrame
. Ale w każdym razie ten przypadek musi mieć trochę przetwarzania końcowego.5.
df.api.types.is_XXX_dtype
podejście.Ten ma być najbardziej niezawodnym i natywnym sposobem na rozpoznanie typu (ścieżka modułu, w którym znajdują się funkcje, mówi sama o sobie), jak przypuszczam. I działa prawie idealnie, ale wciąż ma co najmniej jedno zastrzeżenie i nadal trzeba jakoś rozróżniać kolumny ciągów .
Poza tym może to być subiektywne, ale podejście to ma również bardziej „zrozumiałe dla człowieka”
number
przetwarzanie grupowe typów w porównaniu z.select_dtypes('number')
:Nie
timedelta
ibool
jest wliczony w cenę. Idealny.Mój potok wykorzystuje dokładnie tę funkcjonalność w tej chwili, a także trochę przetwarzania ręcznego.
Wynik.
Mam nadzieję, że udało mi się przedstawić główną argumentację - że wszystkie omówione podejścia można wykorzystać, ale tylko
pd.DataFrame.select_dtypes()
ipd.api.types.is_XXX_dtype
należy je traktować jako mające zastosowanie.źródło
Jeśli chcesz oznaczyć typ kolumny dataframe jako ciąg, możesz zrobić:
Przykład:
Odpowiedź na Twój kod:
źródło
Aby ładnie wydrukować typy danych kolumn
Aby sprawdzić typy danych, na przykład po imporcie z pliku
Przykładowe wyjście:
źródło