我正在研究多标签分类问题。 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创建虚拟列来直接使用原始数据
答案 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