将逗号分隔字符串的 pandas 列转换为虚拟变量
Converting pandas column of comma-separated strings into dummy variables
在我的数据框中,我有一个分类变量,我想将其转换为虚拟变量。但是,此列有多个值,用逗号分隔:
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
使用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
编辑:更新答案以解决一些问题。
问题 1:为什么系列方法 get_dummies 不接受参数 prefix=... 而 pandas.get_dummies() 接受它
Series.str.get_dummies is a series level method (as the name suggests!). We are one hot encoding values in one Series (or a DataFrame column) and hence there is no need to use prefix. Pandas.get_dummies 另一方面,可以对多列进行热编码。在这种情况下,前缀参数用作原始列的标识符。
如果要将前缀应用于 str.get_dummies,您可以随时使用 DataFrame.add_prefix
df['col'].str.get_dummies(sep=',').add_prefix('col_')
问题 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
str.get_dummies
函数不接受prefix
参数,但可以重命名返回的虚拟DataFrame的列名:
data['col'].str.get_dummies(sep=',').rename(lambda x: 'col_' + x, axis='columns')
在我的数据框中,我有一个分类变量,我想将其转换为虚拟变量。但是,此列有多个值,用逗号分隔:
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
使用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
编辑:更新答案以解决一些问题。
问题 1:为什么系列方法 get_dummies 不接受参数 prefix=... 而 pandas.get_dummies() 接受它
Series.str.get_dummies is a series level method (as the name suggests!). We are one hot encoding values in one Series (or a DataFrame column) and hence there is no need to use prefix. Pandas.get_dummies 另一方面,可以对多列进行热编码。在这种情况下,前缀参数用作原始列的标识符。
如果要将前缀应用于 str.get_dummies,您可以随时使用 DataFrame.add_prefix
df['col'].str.get_dummies(sep=',').add_prefix('col_')
问题 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
str.get_dummies
函数不接受prefix
参数,但可以重命名返回的虚拟DataFrame的列名:
data['col'].str.get_dummies(sep=',').rename(lambda x: 'col_' + x, axis='columns')