Làm thế nào để xác định xem một cột / biến có phải là số hay không trong Pandas / NumPy?


89

Có cách nào tốt hơn để xác định xem một biến có Pandasvà / hoặc NumPynumerichay không?

Tôi có một tự định nghĩa dictionaryvới dtypescác khóa và numeric/ notnhư các giá trị.


15
Bạn có thể kiểm tra dtype.kind in 'biufc'.
Jaime

1
Nhận xét phía trên cái này được đăng bởi Jaime, đơn giản hơn những cái bên dưới và có vẻ như đã hoạt động hoàn hảo ...... cảm ơn
hfrog713

Câu trả lời:


97

Trong pandas 0.20.2bạn có thể làm:

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

Tôi sẽ nói đây là giải pháp thanh lịch hơn. Cảm ơn
như - nếu

84

Bạn có thể sử dụng np.issubdtypeđể kiểm tra xem loại dtype có phải là loại phụ của np.number. Ví dụ:

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

Điều này phù hợp với các kiểu của numpy nhưng không thành công với các kiểu cụ thể của gấu trúc như pd.Categorical như Thomas đã lưu ý . Nếu bạn đang sử dụng is_numeric_dtypehàm phân loại từ gấu trúc là một lựa chọn thay thế tốt hơn 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

Đối với nhiều cột, bạn có thể sử dụng 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)

Và để lựa chọn, gấu trúc hiện có 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
Điều này dường như không hoạt động đáng tin cậy với DataFrames của gấu trúc, vì chúng có thể trả về các danh mục không xác định đối với các danh mục như "danh mục". Numpy sau đó ném "TypeError: kiểu dữ liệu không hiểu"
Thomas

23

Dựa trên câu trả lời của @ jaime trong phần nhận xét, bạn cần kiểm tra .dtype.kindcột quan tâm. Ví dụ;

>>> 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 Ý nghĩa của biufc: bbool, iint ( ucó dấu ), int không dấu, ffloat, cphức tạp. Xem https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind


3
Đây là danh sách tất cả các loại dtype [1]. Chữ thường udành cho số nguyên không dấu; chữ hoa Udành cho unicode. [1]: docs.scipy.org/doc/numpy/reference/generated/…
cbarrick

7

Gấu trúc có select_dtypechức năng. Bạn có thể dễ dàng lọc các cột của bạn trên Int64 , và float64 như thế này:

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

4

Đây là một phương thức giả nội bộ để chỉ trả về dữ liệu kiểu số

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

Vâng, tôi đang cố gắng tìm cách họ làm điều đó. Một mong chờ một chức năng IsNumeric ran nội bộ mỗi cột ... nhưng vẫn không tìm thấy nó trong mã
user2808117

Bạn có thể áp dụng điều này cho mỗi cột, nhưng dễ dàng hơn nhiều chỉ để kiểm tra loại. trong bất kỳ sự kiện nào, hoạt động của gấu trúc loại trừ không phải số khi cần thiết. bạn đang cố làm gì vậy?
Jeff

4

Làm thế nào về việc chỉ kiểm tra loại cho một trong các giá trị trong cột? Chúng tôi luôn có một cái gì đó như thế này:

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

Khi tôi cố gắng kiểm tra các kiểu dữ liệu cho các cột trong khung dữ liệu bên dưới, tôi nhận được chúng là 'đối tượng' chứ không phải kiểu số mà tôi mong đợi:

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

Khi tôi thực hiện những điều sau, nó dường như cho tôi kết quả chính xác:

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

trả lại

True

1

Bạn cũng có thể thử:

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

Nó trả về một danh sách các boolean: Truenếu là số, Falsenếu không.


1

Chỉ để thêm vào tất cả các câu trả lời khác, người ta cũng có thể sử dụng df.info()để lấy kiểu dữ liệu của mỗi cột.


1

Bạn có thể kiểm tra xem một cột nhất định có chứa các giá trị số hay không bằng cách sử dụng kiểu dtypes

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

Lưu ý: "O" phải là viết hoa

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.