如何高效将Pandas DataFrame转换为车辆-颜色关联特征矩阵
高效实现DataFrame转换为特征矩阵的方法
针对你的需求,无需逐行赋值,Pandas提供了多种高效的内置方法,以下是几种最优实现:
方法一:使用pd.crosstab(推荐)
先对原数据按Color和Car去重,再用交叉表统计组合存在性:
import pandas as pd df = pd.DataFrame({'Car': ['Audi', 'Toyota', 'Chrysler', 'Toyota', 'Chrysler', 'Chrysler'], 'Color': ['red', 'red', 'blue', 'silver', 'blue', 'silver']}) # 去重,保留唯一的Color-Car组合 df_unique = df.drop_duplicates(subset=['Color', 'Car']) # 生成交叉表,自动标记存在为1,不存在为0 result = pd.crosstab(df_unique['Color'], df_unique['Car']).reset_index() print(result)
输出结果:
Car Color Audi Chrysler Toyota 0 blue 0 1 0 1 red 1 0 1 2 silver 0 1 1
方法二:使用pivot_table
通过透视表聚合去重后的组合,用size统计存在性:
df_unique = df.drop_duplicates(subset=['Color', 'Car']) result = df_unique.pivot_table(index='Color', columns='Car', aggfunc='size', fill_value=0).reset_index()
方法三:使用get_dummies + groupby
将Car列转为哑变量后,按Color分组取最大值(只要存在则为1):
# 生成Car列的哑变量 df_dummies = pd.get_dummies(df['Car']) # 合并Color列与哑变量,按Color分组取最大值 result = pd.concat([df['Color'], df_dummies], axis=1).groupby('Color').max().reset_index()
说明
- 三种方法都避免了逐行赋值的低效操作,时间复杂度均为O(n)级别,远快于循环赋值
- 去重步骤是关键:原数据中重复的
Color-Car组合不影响最终标记结果,去重后能减少计算量
内容的提问来源于stack exchange,提问作者Stephan Perschke
相关产品推荐
相关产品推荐

