如何为df.str.get_dummies()实现类似pd.get_dummies()的drop_first功能?
实现str.get_dummies()类似pd.get_dummies()的drop_first功能
问题场景
现有如下Pandas Series:
0 mcdonalds, popeyes 1 wendys 2 popeyes 3 mcdonalds 4 mcdonalds dtype: object
使用df.str.get_dummies(sep=', ')生成哑变量DataFrame后,得到:
popeyes wendys mcdonalds 0 1 0 1 1 0 1 0 2 1 0 0 3 0 0 1 4 0 0 1
需要避免虚拟变量陷阱,实现类似pd.get_dummies()中drop_first=True的效果,且不能硬编码指定要删除的列名。
解决方案
方法1:用iloc快速移除列
这是最直接的方式,通过位置索引自动移除第一列或最后一列,无需指定列名:
- 移除第一列(对应
drop_first=True的默认行为):
dummies = df.str.get_dummies(sep=', ') result = dummies.iloc[:, 1:]
输出结果:
wendys mcdonalds 0 0 1 1 1 0 2 0 0 3 0 1 4 0 1
- 移除最后一列(匹配给出的预期输出):
dummies = df.str.get_dummies(sep=', ') result = dummies.iloc[:, :-1]
输出结果:
popeyes wendys 0 1 0 1 0 1 2 1 0 3 0 0 4 0 0
方法2:结合pd.get_dummies原生参数
如果想完全贴合pd.get_dummies的drop_first逻辑,可以先把多值Series拆成长格式,再生成哑变量:
import pandas as pd # 拆分每个元素为单独行 long_format = df.str.split(', ', expand=True).stack().reset_index(level=1, drop=True).to_frame('brand') # 生成哑变量并自动移除第一列,最后按原索引聚合 result = pd.get_dummies(long_format, drop_first=True).groupby(level=0).max()
这个方法生成的结果和iloc[:, :-1]一致,完全不用硬编码列名。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

