我有一个像这样的数据集:
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
以此类推。
使用类别的视图对类别进行基本编码。请帮助。
答案 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
然后用multiply
和groupby
(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