如何将单列分类的NumPy数组/Pandas DataFrame转为多列布尔矩阵?
高效实现单列分类数据转布尔矩阵(Pandas/NumPy方案)
嘿,这个需求根本不用自己写迭代逻辑!Pandas和NumPy都有现成的高效方法,尤其是Pandas的内置函数完全贴合你的场景,性能比手动循环强太多,下面给你详细拆解:
首选方案:Pandas get_dummies() 一步到位
Pandas的pd.get_dummies()就是专门为分类数据编码设计的工具,直接生成对应列的矩阵,再转成布尔类型即可:
步骤示例
- 先模拟你的原始DataFrame:
import pandas as pd # 示例数据:单列分类数据 df = pd.DataFrame({'category': ['Dog', 'Cat', 'Dog', 'Bird', 'Cat', 'Dog']})
- 生成布尔矩阵:
# 先生成0/1编码矩阵,再转成布尔值 bool_matrix = pd.get_dummies(df['category']).astype(bool)
运行后得到的结果就是你要的布尔矩阵:
| Bird | Cat | Dog | |
|---|---|---|---|
| 0 | False | False | True |
| 1 | False | True | False |
| 2 | False | False | True |
| 3 | True | False | False |
| 4 | False | True | False |
| 5 | False | False | True |
额外细节
- 如果你想保留所有可能的分类(哪怕当前数据里没出现),可以先把列转成
Categorical类型再处理:
这样会自动生成df['category'] = pd.Categorical(df['category'], categories=['Dog', 'Cat', 'Bird', 'Fish']) bool_matrix = pd.get_dummies(df['category']).astype(bool)Fish列,所有值都是False。 - 这个方法是Pandas内部优化的向量化操作,数据量越大,比手动迭代的速度优势越明显。
备选:纯NumPy实现思路
如果偏好NumPy,可以先把分类映射成整数编码,再用单位矩阵索引生成布尔矩阵:
import numpy as np # 提取唯一分类并建立映射关系 categories = df['category'].unique() cat_to_idx = {cat: idx for idx, cat in enumerate(categories)} # 把分类转成整数编码 encoded = df['category'].map(cat_to_idx).values # 生成布尔矩阵 bool_matrix_np = np.eye(len(categories), dtype=bool)[encoded]
不过这个方法需要手动处理分类映射,不如Pandas方案简洁,推荐优先用get_dummies()。
内容的提问来源于stack exchange,提问作者Mauricio Martinez
相关产品推荐
相关产品推荐

