Pandas / NumPy'de bir sütunun / değişkenin sayısal olup olmadığı nasıl belirlenir?


90

Olsun bir değişkeni belirlemek için daha iyi bir yolu var mı Pandasve / veya NumPybir numericya da değil?

Ben tanımlanmış bir benliğe sahip dictionaryolan dtypesanahtarlar gibi numeric/ notdeğerler olarak.


16
Kontrol edebilirsin dtype.kind in 'biufc'.
Jaime

1
Jaime tarafından yayınlanan bunun üzerindeki yorum, aşağıdakilerden daha basitti ve mükemmel çalışıyor gibi görünüyor ...... teşekkürler
hfrog713

Yanıtlar:


101

Gelen pandas 0.20.2yapabileceğiniz:

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

Bunun daha zarif bir çözüm olduğunu söyleyebilirim. Teşekkürler
sanki -

85

np.issubdtypeDtype'ın bir alt türü olup olmadığını kontrol etmek için kullanabilirsiniz np.number. Örnekler:

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

Bu, numpy'nin dtype'lerinde işe yarar, ancak Thomas'ın belirttiği gibi pd.Categorical gibi pandalara özgü türler için başarısız olur . is_numeric_dtypePandaların categoricals işlevini kullanıyorsanız , np.issubdtype işlevinden daha iyi bir alternatiftir.

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

Birden çok sütun için np.vectorize kullanabilirsiniz:

is_number = np.vectorize(lambda x: np.issubdtype(x, np.number))
is_number(df.dtypes)
Out: array([ True,  True,  True, False], dtype=bool)

Ve seçim için pandalarda artık şunlar var 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

1
Pandalar DataFrames ile güvenilir bir şekilde çalışmıyor gibi görünmektedir, çünkü bunlar "kategori" gibi uyuşmuş olarak bilinmeyen kategorileri döndürebilir. Ardından Numpy, "TypeError: veri türü anlaşılmadı" mesajını atar
Thomas

23

@ Jaime'nin yorumlardaki cevabına göre .dtype.kind, ilgilenilen sütunu kontrol etmeniz gerekir . Örneğin;

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

NB Anlamı biufc: bbool, iint (işaretli), uişaretsiz int, ffloat, ckarmaşık. Bkz. Https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind


3
İşte tüm dtype türlerinin listesi [1]. Küçük harf u, işaretsiz tamsayı içindir; büyük harf Uunicode içindir. [1]: docs.scipy.org/doc/numpy/reference/generated/…
cbarrick

7

Pandaların select_dtypeişlevi vardır. Kolayca üzerinde sütunları filtre Int64 ve float64 böyle:

df.select_dtypes(include=['int64','float64'])

4

Bu, yalnızca sayısal tür verilerini döndürmek için sözde dahili bir yöntemdir

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

Evet, bunu nasıl yaptıklarını anlamaya çalışıyordum. Biri, dahili bir IsNumeric işlevinin sütun başına çalıştırılmasını bekleyebilirdi ... ancak yine de kodda bulamadı
user2808117

Bunu her sütun için uygulayabilirsiniz, ancak dtype'ı kontrol etmek çok daha kolaydır. her durumda, pandalar işlemleri gerektiğinde sayısal olmayanları hariç tutar. ne yapmaya çalışıyorsun?
Jeff

4

Sütundaki değerlerden biri için türü kontrol etmeye ne dersiniz? Hep böyle bir şey yaşadık:

isinstance(x, (int, long, float, complex))

Aşağıdaki veri çerçevesindeki sütunların veri türlerini kontrol etmeye çalıştığımda, onları beklediğim sayısal bir tür değil, 'nesne' olarak alıyorum:

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

Aşağıdakileri yaptığımda bana doğru sonuç veriyor gibi görünüyor:

isinstance(df['test1'][len(df['test1'])-1], (int, long, float, complex))

İadeler

True

1

Şunları da deneyebilirsiniz:

df_dtypes = np.array(df.dtypes)
df_numericDtypes= [x.kind in 'bifc' for x in df_dtypes]

Bir boole listesi döndürür: Truesayısal ise, Falsedeğilse.


1

Sadece diğer tüm cevaplara eklemek için df.info(), her sütunun veri türünü elde etmek için de kullanılabilir .


1

Belirli bir sütunun sayısal değerler içerip içermediğini dtype kullanarak kontrol edebilirsiniz.

numerical_features = [feature for feature in train_df.columns if train_df[feature].dtypes != 'O']

Not: "O" büyük harf olmalıdır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.