Python Pandas如何高效将object文本字段标准化为指定分类用于聚类
实现方案
字段覆盖说明
可以直接覆盖原有beverages字段,如果需要保留原始取值留作后续溯源,可以先备份原始值再覆盖:
df['beverages_raw'] = df['beverages'].copy()
高效分箱实现
推荐两种适配需求的实现方式,均支持模糊匹配规则,完全符合你给出的示例转换逻辑:
方案1:np.select向量化匹配(性能最优,扩展性强)
利用numpy的向量化条件判断,比循环/apply执行效率更高,新增分类时只需要扩展条件列表即可:
import numpy as np import pandas as pd # 按优先级定义匹配条件,case=False忽略大小写,na=False将空值视为不匹配 conditions = [ df['beverages'].str.contains('milk', case=False, na=False), df['beverages'].str.contains('water', case=False, na=False), df['beverages'].str.contains('soda', case=False, na=False) ] # 条件对应的分类取值 choices = ['milk', 'water', 'soda'] # 未匹配到的取值默认归为other,直接覆盖原有字段 df['beverages'] = np.select(conditions, choices, default='other')
方案2:lambda+if-else嵌套(写法简洁,适合少量分类)
如果分类逻辑固定且数量少,可以直接用apply加嵌套判断实现:
df['beverages'] = df['beverages'].astype(str).apply( lambda x: 'milk' if 'milk' in x.lower() else 'water' if 'water' in x.lower() else 'soda' if 'soda' in x.lower() else 'other' )
通配符扩展说明
如果需要更复杂的通配匹配规则,str.contains原生支持正则表达式,替代通用通配符即可:
- 匹配任意位置含milk的取值:对应通配
*milk*,正则写milk即可 - 匹配以milk开头的取值:对应通配
milk*,正则写^milk - 匹配以milk结尾的取值:对应通配
*milk,正则写milk$
后续One-Hot编码处理
分箱完成后beverages字段仅保留4个分类取值,直接用get_dummies生成编码字段即可供聚类使用:
df = pd.get_dummies(df, columns=['beverages'], dtype=int)
运行后会自动生成beverages_milk、beverages_water、beverages_soda、beverages_other四个0/1特征列。
内容的提问来源于stack exchange,提问作者Peter Abraldes
相关产品推荐
相关产品推荐

