You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更高效地对DataFrame的amenities列进行手动独热编码?

高效实现设施列的独热编码优化方案

原代码循环调用apply逐行判断的方式效率低下,尤其是数据量较大时,以下是几种更高效的实现方式:

方法1:使用MultiLabelBinarizer(推荐)

这是sklearn专门为多标签场景设计的工具,内部基于向量化操作,效率极高,且无需额外类型转换:

from sklearn.preprocessing import MultiLabelBinarizer
import pandas as pd

# 初始化编码器,指定要编码的设施列表
mlb = MultiLabelBinarizer(classes=amenities_list)
# 批量生成独热编码矩阵
one_hot_matrix = mlb.fit_transform(amenities_df['amenities'])
# 转换为DataFrame并与原数据合并
one_hot_df = pd.DataFrame(one_hot_matrix, columns=mlb.classes_, index=amenities_df.index)
amenities_df = pd.concat([amenities_df, one_hot_df], axis=1)

方法2:用pandas explode + crosstab

无需依赖sklearn,利用pandas内置的向量化操作实现:

# 将每行的设施列表拆分为多行,保留原索引
exploded_df = amenities_df['amenities'].explode().reset_index()
# 生成交叉表,自动统计每个样本的设施存在情况
one_hot_df = pd.crosstab(exploded_df['index'], exploded_df['amenities'])
# 确保所有目标设施都在列中,缺失的补0
one_hot_df = one_hot_df.reindex(columns=amenities_list, fill_value=0)
# 合并回原DataFrame
amenities_df = amenities_df.join(one_hot_df)

方法3:列表推导式批量构造

如果不想引入外部库,用Python列表推导式替代逐行apply,效率也远高于原代码:

# 批量生成每行的独热编码值
one_hot_data = [[1 if amenity in row else 0 for amenity in amenities_list] for row in amenities_df['amenities']]
# 转换为DataFrame并合并
one_hot_df = pd.DataFrame(one_hot_data, columns=amenities_list, index=amenities_df.index)
amenities_df = pd.concat([amenities_df, one_hot_df], axis=1)

注意事项

原代码中str(x)的转换存在风险:若设施名称存在包含关系(比如"WiFi"和"Free WiFi"),会导致误判。直接用amenity in x判断列表成员更准确,前提是amenities列的每行值本身是列表类型。

内容的提问来源于stack exchange,提问作者B_fig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:25:14