python:如何基于另一列分别对数据框列的唯一元素求和

ros*_*fun 1 python dataframe pandas

例如,我有一个带有两列的df.

输入

df = pd.DataFrame({'user_id':list('aaabbbccc'),'label':[0,0,1,0,0,2,0,1,2]})
print('df\n',df)
Run Code Online (Sandbox Code Playgroud)

产量

df
    label user_id
0      0       a
1      0       a
2      1       a
3      0       b
4      0       b
5      2       b
6      0       c
7      1       c
8      2       c
Run Code Online (Sandbox Code Playgroud)

我想label分别按user_id 计算group中的元素.预期输出如下所示.

预期

  df
    label user_id  label_0  label_1  label_2
0      0       a        2         1         0
1      0       a        2         1         0
2      1       a        2         1         0
3      0       b        2         0         1
4      0       b        2         0         1
5      2       b        2         0         1
6      0       c        1         1         1 
7      1       c        1         1         1
8      2       c        1         1         1
Run Code Online (Sandbox Code Playgroud)

简单地说,在列label_0,我算的数0label根据列user_id.

希望能得到帮助!

jez*_*ael 6

想法是DataFrame通过groupby使用sizevalue_counts然后unstackjoin原始创建帮助df:

df = (df.join(df.groupby(['user_id', 'label'])
                .size()
                .unstack(fill_value=0)
                .add_prefix('label_'), 'user_id'))
Run Code Online (Sandbox Code Playgroud)
df = (df.join(df.groupby('user_id')['label']
                .value_counts()
                .unstack(fill_value=0)
                .add_prefix('label_'), 'user_id'))
Run Code Online (Sandbox Code Playgroud)

或使用crosstabmerge左连接:

df = (df.merge(pd.crosstab(df['user_id'], df['label'])
                 .add_prefix('label_'), on='user_id', how='left'))
Run Code Online (Sandbox Code Playgroud)
print (df)
  user_id  label  label_0  label_1  label_2
0       a      0        1        2        0
1       a      1        1        2        0
2       a      1        1        2        0
3       b      1        1        1        1
4       b      2        1        1        1
5       b      0        1        1        1
6       c      0        1        1        1
7       c      1        1        1        1
8       c      2        1        1        1
Run Code Online (Sandbox Code Playgroud)