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

2024-10-01 07:26:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下的数据集:

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

等等

基本上用他们拥有的视图对类别进行编码。请帮忙


Tags: 数据用户标记视图id编码类别views
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

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

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

相关问题 更多 >