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

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


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 个值。请建议获取这样的编码分类变量的方法


慕田峪7331174
浏览 131回答 3
3回答

梦里花落0921

您可以尝试对 进行分组,uid并在之后获取其他列的最大值get_dummies(pd.get_dummies(my_df ,columns=['days'],prefix='',prefix_sep='')   .groupby('uid',sort=False).max())或者用pivot替代:my_df.pivot_table(index="uid",columns="days",aggfunc='size',fill_value=0)     D1  D2  D3  D4uid                4     1   0   0   13     0   0   1   16     0   1   1   01     0   1   0   0

千万里不及你

您可以使用crosstab+ clip:df = pd.crosstab(my_df['uid'], my_df['days']).clip(upper=1)days  D1  D2  D3  D4uid                 1      0   1   0   03      0   0   1   14      1   0   0   16      0   1   1   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_D40   1     0       1        0       01   3     0       0        1       12   4     1       0        0       13   6     0       1        1       0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python