将逗号分隔字符串的熊猫列转换为虚拟变量

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')

【讨论】:

以上是关于将逗号分隔字符串的熊猫列转换为虚拟变量的主要内容,如果未能解决你的问题,请参考以下文章

将整列整数转换为字符串,在 Pandas 中使用逗号分隔千位

使用逗号分隔符将单个 CSV 列批量转换为多个

熊猫数据框列有带逗号的字符串如何将其转换为列表[关闭]

熊猫合并列以使用逗号分隔值创建新列

将逗号分隔值转换为双引号逗号分隔字符串

python中,如何将字符串中的多个不等量空格改为改为逗号分隔?