在一行而不是多行中获取编码的分类变量

get encoded categorical variables in one row rather than multiple rows

我有与此类似的原始数据框

my_df = pd.DataFrame({'uid': [4, 3, 6, 4, 3, 6, 1],'days': ['D1', 'D3', 'D3', 'D4', 'D4', 'D2','D2']})

  uid   days
0   4   D1
1   3   D3
2   6   D3
3   4   D4
4   3   D4


我使用 get_dummies() 得到了这种编码数据帧。

my_new_df = pd.get_dummies(my_df ,columns=['days'])

uid days_D1 days_D2 days_D3 days_D4
0   4   1   0   0   0
1   3   0   0   1   0
2   6   0   0   1   0
3   4   0   0   0   1
4   3   0   0   0   1


我想要一个数据框,其中我的所有分类值都针对每个 uid 编码在一行中。像这样

uid D1 D2 D3 D4
4    1  0  0 1
3    0  0  1 1
6    0  1  1 0
1    0  1  0 0


我曾尝试寻找一种优化方法来实现此结果,但我无法做到。我的原始数据框有 222000 个值。请建议像这样获取编码分类变量的方法

您可以尝试在 uid 上分组并在 get_dummies

之后获取其他列的最大值
(pd.get_dummies(my_df ,columns=['days'],prefix='',prefix_sep='')
   .groupby('uid',sort=False).max())

或者和枢轴替代:

my_df.pivot_table(index="uid",columns="days",aggfunc='size',fill_value=0)

     D1  D2  D3  D4
uid                
4     1   0   0   1
3     0   0   1   1
6     0   1   1   0
1     0   1   0   0

试试这个选项:

ss = pd.get_dummies(my_df, columns=['days']).groupby(['uid'], as_index=False).sum()
print(ss)

输出:

    uid days_D1 days_D2 days_D3 days_D4
0   1     0       1        0       0
1   3     0       0        1       1
2   4     1       0        0       1
3   6     0       1        1       0

您可以使用 crosstab + clip:

df = pd.crosstab(my_df['uid'], my_df['days']).clip(upper=1)

days  D1  D2  D3  D4
uid                 
1      0   1   0   0
3      0   0   1   1
4      1   0   0   1
6      0   1   1   0