Powiedziałbym, że jest to bardziej eleganckie rozwiązanie. Dzięki
jak gdyby
84
Możesz użyć, np.issubdtypeaby sprawdzić, czy dtype jest podtypem np.number. Przykłady:
np.issubdtype(arr.dtype, np.number) # where arr is a numpy array
np.issubdtype(df['X'].dtype, np.number) # where df['X'] is a pandas Series
Działa to dla dtypów numpy'ego, ale zawodzi w przypadku specyficznych typów pand, takich jak pd. Kategoryczne, jak zauważył Thomas . Jeśli używasz kategorii, is_numeric_dtypefunkcja z pand jest lepszą alternatywą niż np.issubdtype.
df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0],
'C': [1j, 2j, 3j], 'D': ['a', 'b', 'c']})
df
Out:
A B C D
011.01j a
122.02j b
233.03j c
df.dtypes
Out:
A int64
B float64
C complex128
D object
dtype: object
Wydaje się, że nie działa to niezawodnie z pandami DataFrames, ponieważ mogą one zwracać nieznane kategorie, takie jak „kategoria”. Numpy wyrzuca następnie „TypeError: typ danych niezrozumiały”
Thomas,
23
W oparciu o odpowiedź @ jaime w komentarzach, musisz sprawdzić .dtype.kindkolumnę zainteresowania. Na przykład;
Jest to pseudo-wewnętrzna metoda zwracająca tylko dane liczbowe
In [27]: df = DataFrame(dict(A = np.arange(3),
B = np.random.randn(3),
C = ['foo','bar','bah'],
D = Timestamp('20130101')))
In [28]: df
Out[28]:
A B C D
00-0.667672 foo 2013-01-0100:00:00110.811300 bar 2013-01-0100:00:00222.020402 bah 2013-01-0100:00:00
In [29]: df.dtypes
Out[29]:
A int64
B float64
C object
D datetime64[ns]
dtype: object
In [30]: df._get_numeric_data()
Out[30]:
A B
00-0.667672110.811300222.020402
Tak, próbowałem wymyślić, jak oni to robią. Można by oczekiwać, że wewnętrzna funkcja IsNumeric działała na kolumnę ... ale nadal nie znalazłem jej w kodzie
user2808117
Możesz zastosować to dla każdej kolumny, ale o wiele łatwiej jest po prostu sprawdzić typ. w każdym przypadku operacje na pandach wykluczają w razie potrzeby wartości nienumeryczne. co próbujesz zrobić?
Jeff
4
Co powiesz na sprawdzenie typu dla jednej z wartości w kolumnie? Zawsze mieliśmy coś takiego:
isinstance(x, (int, long, float, complex))
Kiedy próbuję sprawdzić typy danych dla kolumn w poniższej ramce danych, otrzymuję je jako `` obiekt '', a nie oczekiwany typ liczbowy:
df = pd.DataFrame(columns=('time', 'test1', 'test2'))
for i in range(20):
df.loc[i] = [datetime.now() - timedelta(hours=i*1000),i*10,i*100]
df.dtypes
time datetime64[ns]
test1 object
test2 object
dtype: object
Kiedy wykonuję następujące czynności, wydaje mi się, że daje mi dokładny wynik:
dtype.kind in 'biufc'
.Odpowiedzi:
W
pandas 0.20.2
możesz zrobić:import pandas as pd from pandas.api.types import is_string_dtype from pandas.api.types import is_numeric_dtype df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [1.0, 2.0, 3.0]}) is_string_dtype(df['A']) >>>> True is_numeric_dtype(df['B']) >>>> True
źródło
Możesz użyć,
np.issubdtype
aby sprawdzić, czy dtype jest podtypemnp.number
. Przykłady:np.issubdtype(arr.dtype, np.number) # where arr is a numpy array np.issubdtype(df['X'].dtype, np.number) # where df['X'] is a pandas Series
Działa to dla dtypów numpy'ego, ale zawodzi w przypadku specyficznych typów pand, takich jak pd. Kategoryczne, jak zauważył Thomas . Jeśli używasz kategorii,
is_numeric_dtype
funkcja z pand jest lepszą alternatywą niż np.issubdtype.df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': [1j, 2j, 3j], 'D': ['a', 'b', 'c']}) df Out: A B C D 0 1 1.0 1j a 1 2 2.0 2j b 2 3 3.0 3j c df.dtypes Out: A int64 B float64 C complex128 D object dtype: object
np.issubdtype(df['A'].dtype, np.number) Out: True np.issubdtype(df['B'].dtype, np.number) Out: True np.issubdtype(df['C'].dtype, np.number) Out: True np.issubdtype(df['D'].dtype, np.number) Out: False
Dla wielu kolumn możesz użyć np.vectorize:
is_number = np.vectorize(lambda x: np.issubdtype(x, np.number)) is_number(df.dtypes) Out: array([ True, True, True, False], dtype=bool)
A do selekcji pandy mają teraz
select_dtypes
:df.select_dtypes(include=[np.number]) Out: A B C 0 1 1.0 1j 1 2 2.0 2j 2 3 3.0 3j
źródło
W oparciu o odpowiedź @ jaime w komentarzach, musisz sprawdzić
.dtype.kind
kolumnę zainteresowania. Na przykład;>>> import pandas as pd >>> df = pd.DataFrame({'numeric': [1, 2, 3], 'not_numeric': ['A', 'B', 'C']}) >>> df['numeric'].dtype.kind in 'biufc' >>> True >>> df['not_numeric'].dtype.kind in 'biufc' >>> False
Uwaga: znaczenie
biufc
:b
bool,i
int (signed),u
unsigned int,f
float,c
complex. Zobacz https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kindźródło
u
oznaczają liczbę całkowitą bez znaku; wielkie literyU
oznaczają Unicode. [1]: docs.scipy.org/doc/numpy/reference/generated/...Pandy
select_dtype
pełnią funkcję. Możesz łatwo filtrować kolumny według int64 i float64 w następujący sposób:df.select_dtypes(include=['int64','float64'])
źródło
Jest to pseudo-wewnętrzna metoda zwracająca tylko dane liczbowe
In [27]: df = DataFrame(dict(A = np.arange(3), B = np.random.randn(3), C = ['foo','bar','bah'], D = Timestamp('20130101'))) In [28]: df Out[28]: A B C D 0 0 -0.667672 foo 2013-01-01 00:00:00 1 1 0.811300 bar 2013-01-01 00:00:00 2 2 2.020402 bah 2013-01-01 00:00:00 In [29]: df.dtypes Out[29]: A int64 B float64 C object D datetime64[ns] dtype: object In [30]: df._get_numeric_data() Out[30]: A B 0 0 -0.667672 1 1 0.811300 2 2 2.020402
źródło
Co powiesz na sprawdzenie typu dla jednej z wartości w kolumnie? Zawsze mieliśmy coś takiego:
Kiedy próbuję sprawdzić typy danych dla kolumn w poniższej ramce danych, otrzymuję je jako `` obiekt '', a nie oczekiwany typ liczbowy:
df = pd.DataFrame(columns=('time', 'test1', 'test2')) for i in range(20): df.loc[i] = [datetime.now() - timedelta(hours=i*1000),i*10,i*100] df.dtypes time datetime64[ns] test1 object test2 object dtype: object
Kiedy wykonuję następujące czynności, wydaje mi się, że daje mi dokładny wynik:
isinstance(df['test1'][len(df['test1'])-1], (int, long, float, complex))
zwroty
True
źródło
Aby dodać do wszystkich innych odpowiedzi, można również użyć,
df.info()
aby uzyskać typ danych w każdej kolumnie.źródło
Możesz sprawdzić, czy dana kolumna zawiera wartości liczbowe, czy nie, za pomocą dtypes
numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']
Uwaga: „O” powinno być duże
źródło
Możesz też spróbować:
df_dtypes = np.array(df.dtypes) df_numericDtypes= [x.kind in 'bifc' for x in df_dtypes]
Zwraca listę wartości logicznych:
True
jeśli numeryczne,False
jeśli nie.źródło