如何预处理pandas字符串数据表以适配sklearn聚类算法
原始数据样例
| Groups | Role | User | Occurences |
|---|---|---|---|
| GUS | DEFAULT_M | PASTYP | 47251 |
| RSS | DEFAULT_R | PASTYP | 27057 |
| RRD | DEFAULT_M | DANART | 21251 |
| NBD | DEFAULT_R | BONEE | 17933 |
| GTS | DEFAULT_Q | BONEE | 16067 |
问题解答
1. 能否直接对字符串类型DataFrame使用sklearn K-Means算法?
不能。K-Means聚类的核心逻辑基于特征的数值距离(通常为欧式距离)计算,字符串类型的特征无法直接参与数值运算,因此必须先将所有特征转换为数值格式后才可输入模型。
2. 无需手动维护映射字典的特征转换方法
以下两种方案均无需手动编写类别映射表,可直接输出模型可识别的数值特征:
独热编码(适用于低基数分类特征,比如Groups、Role字段)
直接调用pandas的get_dummies或者sklearn的OneHotEncoder即可自动完成分类值到数值的映射,适合类别数量较少的字段,特征可解释性强。
代码示例:import pandas as pd from sklearn.preprocessing import OneHotEncoder import numpy as np # 假设df为你的原始DataFrame # 方法1:pandas快速实现 encoded_df = pd.get_dummies(df, columns=['Groups', 'Role', 'User'], dtype=int) final_features = encoded_df.values # 方法2:sklearn实现,支持后续未知类别自动处理,更适合生产环境 encoder = OneHotEncoder(sparse_output=False, handle_unknown='ignore') cat_features = encoder.fit_transform(df[['Groups', 'Role', 'User']]) # 合并原有的数值列Occurences final_features = np.hstack([cat_features, df[['Occurences']].values])特征哈希编码(适用于高基数分类特征,比如User字段)
如果User字段的唯一值数量较多,独热编码会导致特征维度爆炸,可使用FeatureHasher固定输出特征维度,无需维护类别映射表,内存占用更低。
代码示例:from sklearn.feature_extraction import FeatureHasher import numpy as np # n_features可根据数据量调整,一般取2的幂次可减少哈希冲突 hasher = FeatureHasher(n_features=128, input_type='string') # 转换分类字段 cat_features = hasher.fit_transform(df[['Groups', 'Role', 'User']].astype(str).values.tolist()).toarray() # 合并数值列 final_features = np.hstack([cat_features, df[['Occurences']].values])
优化提示:你的最终目标是得到用户维度的分组簇,建议先将原始数据按
User字段聚合,统计每个用户对应各分组、角色的出现次数总和,再做编码和聚类,聚类结果会更贴合业务需求。
内容的提问来源于stack exchange,提问作者Maksad Annamuradov
相关产品推荐
相关产品推荐

