在用户级别进行分组并编码分类数据

时间:2019-05-20 17:27:48

标签: python pandas encoding group-by pivot

我有一个像这样的数据集:

user    ID   cat1   cat2   views
12345   1      A      B     1 
67890   2      D      F     1
12345   2      D      F     1
34567   3      E      F     2 
67890   3      E      F     1

以此类推。

基本上,每个ID都有唯一数量的类别/标签。因此,如果看到的话,用户ID 2和3在查看时具有相同的标签。

我想将其转换为:

user   cat1_A cat1_D cat1E....   cat2_B cat2_F.....
12345    1      1      0             1     1
67890    0      1      1             0     2
34567    0      0      2             0     2

以此类推。

使用类别的视图对类别进行基本编码。请帮助。

3 个答案:

答案 0 :(得分:3)

我只能想到使用for循环将其拆分,先用pivot然后concat

l = ['cat1', 'cat2']
s = pd.concat([df.pivot_table(index='user', columns=x, values='views',aggfunc='first') for x in l], axis=1, keys=l).fillna(0)
s.columns=s.columns.map('_'.join)
s
Out[392]: 
       cat1_A  cat1_D  cat1_E  cat2_B  cat2_F
user                                         
12345     1.0     1.0     0.0     1.0     1.0
34567     0.0     0.0     2.0     0.0     2.0
67890     0.0     1.0     1.0     0.0     1.0

答案 1 :(得分:3)

IIUC:

d = df.set_index('user')[['cat1', 'cat2']].stack().str.get_dummies().sum(level=[0, 1])
d

            A  B  D  E  F
user                     
12345 cat1  1  0  1  0  0
      cat2  0  1  0  0  1
67890 cat1  0  0  1  1  0
      cat2  0  0  0  0  2
34567 cat1  0  0  0  1  0
      cat2  0  0  0  0  1

然后整理房间

d.unstack().swaplevel(0, 1, 1).sort_index(1).loc[:, lambda x: x.gt(0).any()]

      cat1       cat2   
         A  D  E    B  F
user                    
12345    1  1  0    1  1
34567    0  0  1    0  1
67890    0  1  1    0  2

根据需要组合级别

d.unstack().swaplevel(0, 1, 1).sort_index(1).loc[:, lambda x: x.gt(0).any()].pipe(
    lambda x: x.set_axis([f'{a}_{b}' for a, b in x.columns], axis=1, inplace=False)
)

       cat1_A  cat1_D  cat1_E  cat2_B  cat2_F
user                                         
12345       1       1       0       1       1
34567       0       0       1       0       1
67890       0       1       1       0       2

答案 2 :(得分:2)

先用pd.get_dummies然后用multiplygroupby

(pd.get_dummies(df[['cat1', 'cat2']])
   .multiply(df.views, axis=0)
   .groupby(df.user).sum()
)

输出:

       cat1_A  cat1_D  cat1_E  cat2_B  cat2_F
user                                         
12345       1       1       0       1       1
34567       0       0       2       0       2
67890       0       1       1       0       2