使用pandas对逗号分隔列生成哑变量时出现重复列的问题及解决
Pandas Series生成哑变量出现重复列的原因与解决方法
原始Series
0 mcdonalds, popeyes 1 wendys 2 popeyes 3 mcdonalds 4 mcdonalds dtype: object
期望的哑变量结果
popeyes wendys mcdonalds 0 1 0 1 1 0 1 0 2 1 0 0 3 0 0 1 4 0 0 1
遇到的问题
使用t.str.get_dummies(sep=',')后出现重复的popeyes列:
popeyes wendys mcdonalds popeyes 0 1 0 1 0 1 0 1 0 0 2 0 0 0 1 3 0 0 1 0 4 0 0 1 0
原因
重复列的核心问题是原始字符串中存在空格不一致的类别:
- 第一行的
popeyes是逗号后带前缀空格的popeyes - 第三行的
popeyes是无空格的纯字符串str.get_dummies会把这两个视为完全不同的类别,因此生成了重复列。
解决方法
先对Series做字符串清洗,统一类别格式,再生成哑变量,有两种常用方式:
方法1:先清洗空格再调用get_dummies
import pandas as pd # 原始Series t = pd.Series(["mcdonalds, popeyes", "wendys", "popeyes", "mcdonalds", "mcdonalds"]) # 清洗:替换逗号后的空格,同时去掉字符串首尾多余空格 t_clean = t.str.replace(r',\s+', ',', regex=True).str.strip() # 生成哑变量 dummies = t_clean.str.get_dummies(sep=',') print(dummies)
方法2:拆分后去重再聚合
import pandas as pd t = pd.Series(["mcdonalds, popeyes", "wendys", "popeyes", "mcdonalds", "mcdonalds"]) # 按逗号拆分,堆叠成多级索引Series,去除每个元素的空格 split_data = t.str.split(',', expand=True).stack().str.strip() # 生成哑变量后按原索引分组求和 dummies = pd.get_dummies(split_data).groupby(level=0).sum() print(dummies)
两种方法都能得到你期望的无重复列的哑变量结果。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

