首页 > 解决方案 > Categorical variables into multiple columns (2)

问题描述

I have a dataframe with a categorical variable Segment

ID  Segment Var1 Var2 Var3
1   AAA     1    1    1
2   BBB     1    0    1
3   BBB     1    1    1
4   AAA     0    1    1
5   CCC     0    1    1
6   AAA     0    0    1
7   AAA     0    1    1
8   AAA     1    0    1
9   BBB     1    0    1
10  CCC     1    0    1

And I would like to transform a column Segment into 3 categories for each variable like this:

ID Var1_AAA Var1_BBB Var1_CCC Var2_AAA Var2_BBB Var2_CC Var3_AAA Var3_BBB  Var3_CCC
1  1        null     null     1         null    null    1        null     null
2  null     1        null     null      0       null    null     1        null
3  null     1        null     null      1       null    null     1        null
4  0        null     null     1         null    null    1        null     null
5  null     null     0        null      null    1       null     null     1
6  0        null     null     0         null    null    1        null     null
7  0        null     null     1         null    null    1        null     null
8  1        null     null     0         null    null    1        null     null
9  null     1        null     null      0       null    null     1        null
10 null     null     1        null      null    0       null     null     1

Could you please help me with that?

标签: pythonpandasnumpy

解决方案


meltpivot_table

v = df.melt(['ID', 'Segment'])
v = v.pivot_table(index='ID', 
                  columns=['Segment', 'variable'], 
                  values='value', 
                  fill_value='null')
v.columns = v.columns.map('{0[1]}_{0[0]}'.format)

print(v)

   Var1_AAA Var2_AAA Var3_AAA Var1_BBB Var2_BBB Var3_BBB Var1_CCC Var2_CCC  \
ID                                                                           
1         1        1        1     null     null     null     null     null   
2      null     null     null        1        0        1     null     null   
3      null     null     null        1        1        1     null     null   
4         0        1        1     null     null     null     null     null   
5      null     null     null     null     null     null        0        1   
6         0        0        1     null     null     null     null     null   
7         0        1        1     null     null     null     null     null   
8         1        0        1     null     null     null     null     null   
9      null     null     null        1        0        1     null     null   
10     null     null     null     null     null     null        1        0   

   Var3_CCC  
ID           
1      null  
2      null  
3      null  
4      null  
5         1  
6      null  
7      null  
8      null  
9      null  
10        1  

我建议省略fill_value='null', 而是将其替换为fill_value=0或完全删除,因为将字符串与数字数据混合会影响性能。但是,如果您只是要保存结果而仅此而已,这没关系。


推荐阅读