将逗号分隔字符串的熊猫列转换为虚拟变量
Posted
技术标签:
【中文标题】将逗号分隔字符串的熊猫列转换为虚拟变量【英文标题】:Converting pandas column of comma-separated strings into dummy variables 【发布时间】:2018-04-02 16:38:53 【问题描述】:在我的数据框中,我有一个分类变量,我想将其转换为虚拟变量。但是,此列有多个值,用逗号分隔:
0 'a'
1 'a,b,c'
2 'a,b,d'
3 'd'
4 'c,d'
最终,我希望每个可能的离散值都有二进制列;换句话说,最终列数等于原始列中唯一值的数量。我想我必须使用 split() 来获取每个单独的值,但不确定之后该怎么做。非常感谢任何提示!
编辑:额外的扭曲。列具有空值。作为对评论的回应,以下是所需的输出。谢谢!
a b c d
0 1 0 0 0
1 1 1 1 0
2 1 1 0 1
3 0 0 0 1
4 0 0 1 1
【问题讨论】:
您能否提供您给出的示例的预期输出 【参考方案1】:使用 str.get_dummies
df['col'].str.get_dummies(sep=',')
a b c d
0 1 0 0 0
1 1 1 1 0
2 1 1 0 1
3 0 0 0 1
4 0 0 1 1
编辑:更新答案以解决一些问题。
Qn 1:为什么系列方法 get_dummies 不接受参数 prefix=... 而 pandas.get_dummies() 接受它
Series.str.get_dummies 是一个系列级别的方法(顾名思义!)。我们是一个系列(或 DataFrame 列)中的一个热门编码值,因此不需要使用前缀。另一方面,Pandas.get_dummies 可以对多个列进行热编码。在这种情况下,前缀参数作为原始列的标识符。
如果你想为 str.get_dummies 应用前缀,你总是可以使用DataFrame.add_prefix
df['col'].str.get_dummies(sep=',').add_prefix('col_')
Qn 2:如果您有多个列开始,您如何将虚拟对象合并回原始框架? 您可以使用DataFrame.concat 将一个热编码列与数据框中的其余列合并。
df = pd.DataFrame('other':['x','y','x','x','q'],'col':['a','a,b,c','a,b,d','d','c,d'])
df = pd.concat([df, df['col'].str.get_dummies(sep=',')], axis = 1).drop('col', 1)
other a b c d
0 x 1 0 0 0
1 y 1 1 1 0
2 x 1 1 0 1
3 x 0 0 0 1
4 q 0 0 1 1
【讨论】:
我觉得自己很愚蠢....但这正是我想要做的。谢谢! 你不应该。很少有人知道所有可用的功能,我们其他人处于不同的学习阶段:) 一切顺利 这可能很明显,但是如果您的数据用逗号和空格分隔,请确保包含它!也就是说,sep = ', '
否则,您最终会得到重复的列。
为什么系列方法get_dummies不接受参数prefix=...,而pandas.get_dummies()接受呢?
很好的答案,感谢您在末尾包含 concat 部分。为我节省了大量时间。【参考方案2】:
str.get_dummies
函数不接受prefix
参数,但是可以重命名返回的dummy DataFrame的列名:
data['col'].str.get_dummies(sep=',').rename(lambda x: 'col_' + x, axis='columns')
【讨论】:
以上是关于将逗号分隔字符串的熊猫列转换为虚拟变量的主要内容,如果未能解决你的问题,请参考以下文章