Có cách nào tốt hơn để xác định xem một biến có Pandas
và / hoặc NumPy
có numeric
hay không?
Tôi có một tự định nghĩa dictionary
với dtypes
các khóa và numeric
/ not
như các giá trị.
Có cách nào tốt hơn để xác định xem một biến có Pandas
và / hoặc NumPy
có numeric
hay không?
Tôi có một tự định nghĩa dictionary
với dtypes
các khóa và numeric
/ not
như các giá trị.
Câu trả lời:
Trong pandas 0.20.2
bạ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
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_dtype
hà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
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.kind
cộ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
: b
bool, i
int ( u
có dấu ), int không dấu, f
float, c
phức tạp. Xem https://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.kind.html#numpy.dtype.kind
u
dành cho số nguyên không dấu; chữ hoa U
dành cho unicode. [1]: docs.scipy.org/doc/numpy/reference/generated/…
Gấu trúc có select_dtype
chứ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'])
Đâ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
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
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
dtype.kind in 'biufc'
.