用于多标签分类的输入数据创建

时间:2019-07-08 05:59:24

标签: python-3.x pandas multilabel-classification

我正在研究多标签分类问题。 X中的每个值都是分类值。原始数据如下

ID  X1  X2  X3  Y
111 AA  LL  KK  MMM
111 AA  LL  KK  MMM
111 BB  LL  jj  NNN
121 HH  DD  uu  III
121 HH  DD  yy  OOO
121 HH  LL  aa  PPP

我正在尝试将其转换为一个数据帧,其中列(X1,X2,X3,Y)中存在的每个唯一值都将成为一个新列,并且每个ID都具有一个记录。我想获得的预期输出是

ID  X1_AA   X1_BB   X1_HH   X2_LL   X2_DD   X3_KK   X3_jj   X3_uu   X3_yy   x3_aa   Y_MMM   Y_NNN   Y_III   Y_OOO   Y_PPP
111 1   1   0   1   0   1   1   0   0   0   1   1   0   0   0
121 0   0   1   1   1   0   0   1   1   1   0   0   1   1   1

我尝试使用pandas get_dummies,它正在创建虚拟列,但ID重复。 Y是我的目标列。 ID的多个Y值表示ID已访问多个频道。

还请建议我是否可以通过为分类中的X和Y创建虚拟列来直接使用原始数据

2 个答案:

答案 0 :(得分:1)

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{

    if ((e.Row.RowState & DataControlRowState.Edit) > 0) {
        Label role = (Label)e.Row.FindControl("lblRoles");
        DropDownList ddlRoles = (DropDownList)e.Row.FindControl("ddlRoles");
        ddlRoles.Items.FindByText(role.Text).Selected = true;
    }
}

new_df = pd.get_dummies(df).groupby('ID').sum()
new_df[new_df > 1] = 1

编辑:我不知道groupby中的ID X1_AA X1_BB X1_HH X2_DD X2_LL X3_KK X3_aa X3_jj X3_uu X3_yy Y_III Y_MMM Y_NNN Y_OOO Y_PPP 111 1 1 0 0 1 1 0 1 0 0 0 1 1 0 0 121 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1 方法。 @jezrael的答案绝对是更好的答案。

答案 1 :(得分:1)

对于输出中的虚拟变量,必须汇总max

df1 = pd.get_dummies(df).groupby('ID', as_index=False).max()
print (df1)
    ID  X1_AA  X1_BB  X1_HH  X2_DD  X2_LL  X3_KK  X3_aa  X3_jj  X3_uu  X3_yy  \
0  111      1      1      0      0      1      1      0      1      0      0   
1  121      0      0      1      1      1      0      1      0      1      1   

   Y_III  Y_MMM  Y_NNN  Y_OOO  Y_PPP  
0      0      1      1      0      0  
1      1      0      0      1      1