Hướng dẫn how to check if a column is categorical in python - cách kiểm tra xem một cột có phải là phân loại trong python không

Tôi dường như không thể nhận được một kiểm tra DTYPE đơn giản làm việc với các phân loại được cải tiến của Pandas trong V0.15+. Về cơ bản tôi chỉ muốn một cái gì đó như

df.cat_column.dtype
Out[20]: category
4.

import pandas as pd
import numpy as np
import random

df = pd.DataFrame({
    'x': np.linspace(0, 50, 6),
    'y': np.linspace(0, 20, 6),
    'cat_column': random.sample('abcdef', 6)
})
df['cat_column'] = pd.Categorical(df2['cat_column'])

Chúng ta có thể thấy rằng

df.cat_column.dtype
Out[20]: category
5 cho cột phân loại là 'danh mục':

df.cat_column.dtype
Out[20]: category

Và thông thường chúng ta có thể thực hiện kiểm tra DTYPE bằng cách so sánh với tên của DTYPE:

df.x.dtype == 'float64'
Out[21]: True

Nhưng điều này dường như không hoạt động khi cố gắng kiểm tra xem cột

df.cat_column.dtype
Out[20]: category
6 có phân loại không:

df.x.dtype == 'category'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 df.x.dtype == 'category'

TypeError: data type "category" not understood

Có cách nào để thực hiện các loại séc này trong Pandas V0.15+không?

Đã hỏi ngày 14 tháng 11 năm 2014 lúc 7:21Nov 14, 2014 at 7:21

Hướng dẫn how to check if a column is categorical in python - cách kiểm tra xem một cột có phải là phân loại trong python không

MariusmariusMarius

56.4K15 Huy hiệu vàng105 Huy hiệu bạc102 Huy hiệu đồng15 gold badges105 silver badges102 bronze badges

4

Thay vào đó, sử dụng thuộc tính

df.cat_column.dtype
Out[20]: category
7 để so sánh, nó phải luôn hoạt động vì nó chỉ là một chuỗi:

>>> import numpy as np
>>> arr = np.array([1, 2, 3, 4])
>>> arr.dtype.name
'int64'

>>> import pandas as pd
>>> cat = pd.Categorical(['a', 'b', 'c'])
>>> cat.dtype.name
'category'

Vì vậy, để tổng hợp, bạn có thể kết thúc với một chức năng đơn giản, đơn giản:

def is_categorical(array_like):
    return array_like.dtype.name == 'category'

Đã trả lời ngày 14 tháng 11 năm 2014 lúc 8:32Nov 14, 2014 at 8:32

Jeff Tratnerjeff TratnerJeff Tratner

15.6K4 Huy hiệu vàng45 Huy hiệu bạc66 Huy hiệu Đồng4 gold badges45 silver badges66 bronze badges

Đầu tiên, biểu diễn chuỗi của DTYPE là

df.cat_column.dtype
Out[20]: category
8 chứ không phải
df.cat_column.dtype
Out[20]: category
9, vì vậy điều này hoạt động:

In [41]: df.cat_column.dtype == 'category'
Out[41]: True

Nhưng thực sự, như bạn nhận thấy, so sánh này mang lại một

df.x.dtype == 'float64'
Out[21]: True
0 cho các DTYPE khác, vì vậy bạn sẽ phải bọc nó với một khối
df.x.dtype == 'float64'
Out[21]: True
1.


Các cách khác để kiểm tra bằng Pandas Internals:

In [42]: isinstance(df.cat_column.dtype, pd.api.types.CategoricalDtype)
Out[42]: True

In [43]: pd.api.types.is_categorical_dtype(df.cat_column)
Out[43]: True

Đối với các cột không phân loại, các câu lệnh đó sẽ trả về

df.x.dtype == 'float64'
Out[21]: True
2 thay vì gây ra lỗi. Ví dụ:

In [44]: pd.api.types.is_categorical_dtype(df.x)
Out[44]: False

Đối với phiên bản cũ hơn của

df.x.dtype == 'float64'
Out[21]: True
3, hãy thay thế
df.x.dtype == 'float64'
Out[21]: True
4 trong đoạn trích trên bằng
df.x.dtype == 'float64'
Out[21]: True
5.

MOOT

2.0852 Huy hiệu vàng16 Huy hiệu bạc14 Huy hiệu đồng2 gold badges16 silver badges14 bronze badges

Đã trả lời ngày 14 tháng 11 năm 2014 lúc 7:52Nov 14, 2014 at 7:52

Jorisjorisjoris

127K35 Huy hiệu vàng241 Huy hiệu bạc201 Huy hiệu đồng35 gold badges241 silver badges201 bronze badges

2

Chỉ cần đặt cái này ở đây vì

df.x.dtype == 'float64'
Out[21]: True
6 là những gì tôi thực sự đang tìm kiếm:

df['column'].name in df.select_dtypes(include='category').columns

Cảm ơn @Jeff.

Đã trả lời ngày 24 tháng 10 năm 2019 lúc 8:25Oct 24, 2019 at 8:25

Hướng dẫn how to check if a column is categorical in python - cách kiểm tra xem một cột có phải là phân loại trong python không

Gosutogosutogosuto

5.0494 Huy hiệu vàng36 Huy hiệu bạc57 Huy hiệu đồng4 gold badges36 silver badges57 bronze badges

Trong phiên bản Pandas của tôi (v1.0.3), có sẵn phiên bản ngắn hơn của câu trả lời của Joris.

df.cat_column.dtype
Out[20]: category
0

Đã trả lời ngày 1 tháng 4 năm 2020 lúc 16:36Apr 1, 2020 at 16:36

DieterdpdieterdpDieterDP

3.7312 Huy hiệu vàng27 Huy hiệu bạc36 Huy hiệu đồng2 gold badges27 silver badges36 bronze badges

1

Tôi đã chạy vào chủ đề này để tìm kiếm cùng một chức năng chính xác, và cũng tìm ra một tùy chọn khác, ngay từ tài liệu Pandas ở đây.

Có vẻ như cách thức kinh điển để kiểm tra xem cột DataFrame có phải là một chuỗi phân loại nên như sau không:

df.cat_column.dtype
Out[20]: category
1

Vì vậy, theo ví dụ được đưa ra trong câu hỏi ban đầu, đây sẽ là:

df.cat_column.dtype
Out[20]: category
2

Đã trả lời ngày 17 tháng 9 năm 2020 lúc 15:37Sep 17, 2020 at 15:37

Hướng dẫn how to check if a column is categorical in python - cách kiểm tra xem một cột có phải là phân loại trong python không

Pierre Massépierre MasséPierre Massé

5731 Huy hiệu vàng4 Huy hiệu bạc21 Huy hiệu đồng1 gold badge4 silver badges21 bronze badges

Nhìn vào câu trả lời của @Jeff Tratner, vì điều kiện

df.x.dtype == 'float64'
Out[21]: True
7 không cần phải là
df.x.dtype == 'float64'
Out[21]: True
8 để được coi là một cột là cataegorical, tôi đề xuất xem xét việc phân loại các dtypes trong danh sách 'phân loại_dtypes'.

df.cat_column.dtype
Out[20]: category
3

Đã trả lời ngày 16 tháng 2 lúc 13:28Feb 16 at 13:28

Hướng dẫn how to check if a column is categorical in python - cách kiểm tra xem một cột có phải là phân loại trong python không