将多列分类变量重塑并编码为一个热编码

2024-05-17 06:58:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些数据如下:

    Owner   Label1  Label2  Label3      
    Bob     Dog     N/A     N/A 
    John    Cat     Mouse   N/A 
    Lee     Dog     Cat     N/A
    Jane    Hamster Rat     Ferret

我想把它改成一个热编码。像这样:

^{2}$

我已经查看了文档和stackoverflow,但还不能确定实现这一点的相关函数。get_dummies非常接近,但是只有当每个类别出现在相应的列中时,它才会为每个类别创建前缀。在


Tags: 数据john类别catbobownerdogjane
3条回答

sklearn.preprocessing.MultiLabelBinarizer

from sklearn.preprocessing import MultiLabelBinarizer

o, l = zip(*[[o, [*filter(pd.notna, l)]] for o, *l in zip(*map(df.get, df))])

mlb = MultiLabelBinarizer()

d = mlb.fit_transform(l)
pd.DataFrame(d, o, mlb.classes_)

      Cat  Dog  Ferret  Hamster  Mouse  Rat
Bob     0    1       0        0      0    0
John    1    0       0        0      1    0
Lee     1    1       0        0      0    0
Jane    0    0       1        1      0    1

同样的答案

^{pr2}$

您可以对堆栈数据集使用get_dummies,然后使用groupby和sum:

pd.get_dummies(df.set_index('Owner').stack()).groupby('Owner').sum()

       Cat  Dog  Ferret  Hamster  Mouse  Rat
Owner                                       
Bob      0    1       0        0      0    0
John     1    0       0        0      1    0
Lee      1    1       0        0      0    0
Jane     0    0       1        1      0    1

使用

df.set_index('Owner').stack().str.get_dummies().sum(level=0)
Out[535]: 
       Cat  Dog  Ferret  Hamster  Mouse  Rat
Owner                                       
Bob      0    1       0        0      0    0
John     1    0       0        0      1    0
Lee      1    1       0        0      0    0
Jane     0    0       1        1      0    1

或者

^{pr2}$

相关问题 更多 >