【问题标题】:Categorical variables into multiple columns (2)分类变量分为多列 (2)
【发布时间】:2018-06-18 17:01:54
【问题描述】:

我有一个带有分类变量 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

我想为每个变量将列 Segment 转换为 3 个类别,如下所示:

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

你能帮我解决这个问题吗?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    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 或完全删除,因为将字符串与数字数据混合会影响性能。但是,如果您只是要保存结果而仅此而已,则可以这样做。

    【讨论】:

      【解决方案2】:

      另一种方法是,

      使用unstack 格式和您的数据框列名

      df= df.set_index(['ID','Segment']).unstack(fill_value='null')
      df.columns = ['_'.join(val ) for val in zip(df.columns.get_level_values(0),df.columns.get_level_values(1))] 
      

      或者以更优雅的方式格式化列,

      df.columns = df.columns.map('{0[0]}_{0[1]}'.format)
      print df
      

      输出:

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

      【讨论】:

        猜你喜欢
        • 2018-11-24
        • 2022-01-01
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多