熊猫:将多个变量转换为一组虚拟变量
问题描述:
我有一个包含类别(A,B,C,D)的列,我想变成虚拟变量。问题是,该列可以包含每行多个类别,例如:熊猫:将多个变量转换为一组虚拟变量
DF = pd.DataFrame({'Col':['A', 'A, B', 'A, C', 'B, C, D', 'D']})
Col
0 A
1 A, B
2 A, C
3 B, C, D
4 D
我在这一点想到的是第一分割使用可变分为多个字段“”作为分隔符,则伪代码的结果。事情是这样的:
DF2 = DF['Col'].str.split(', ', expand = True)
0 1 2
0 A None None
1 A B None
2 A C None
3 B C D
4 D None None
pd.get_dummies(DF2)
0_A 0_B 0_D 1_B 1_C 2_D
0 1 0 0 0 0 0
1 1 0 0 1 0 0
2 1 0 0 0 1 0
3 0 1 0 0 1 1
4 0 0 1 0 0 0
最后,通过运行某种循环的跨列创建一组为A,B,C和D这可以工作虚拟变量,但得到相当繁琐了许多更多的变量/类别。有没有更简单的方法来实现这一目标?
答
简单的方法是
DF.Col.str.get_dummies(', ')
A B C D
0 1 0 0 0
1 1 1 0 0
2 1 0 1 0
3 0 1 1 1
4 0 0 0 1
稍微复杂
from sklearn.preprocessing import MultiLabelBinarizer
from numpy.core.defchararray import split
mlb = MultiLabelBinarizer()
s = DF.Col.values.astype(str)
d = mlb.fit_transform(split(s, ', '))
pd.DataFrame(d, columns=mlb.classes_)
A B C D
0 1 0 0 0
1 1 1 0 0
2 1 0 1 0
3 0 1 1 1
4 0 0 0 1
+0
就是这样。谢谢。 – AdmiralWen
答
通过使用pd.crosstab
import pandas as pd
df = pd.DataFrame({'Col':['A', 'A,B', 'A,C', 'B,C,D', 'D']})
df.Col=df.Col.str.split(',')
df1=df.Col.apply(pd.Series).stack()
pd.crosstab(df1.index.get_level_values(0),df1)
Out[893]:
col_0 A B C D
row_0
0 1 0 0 0
1 1 1 0 0
2 1 0 1 0
3 0 1 1 1
4 0 0 0 1
检查链接.. https://*.com/questions/46290726 /如何对化妆dummy-变量与逗号分隔值列 – Wen