Skip to main content
 首页 » 编程设计

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

2025年05月04日13jirigala

例如,我有一个包含两列的 df。

输入

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

输出

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 

我想分别按user_id统计label组中的元素。 预期输出如下所示。

预期

  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 

简而言之,在 label_0 列中,我根据 user_id 列计算 label 列中 0 的数量.

希望得到帮助!

请您参考如下方法:

想法是通过 groupby 创建助手 DataFrame与 size或 value_counts然后 unstack和 join到原始的df:

df = (df.join(df.groupby(['user_id', 'label']) 
                .size() 
                .unstack(fill_value=0) 
                .add_prefix('label_'), 'user_id')) 

df = (df.join(df.groupby('user_id')['label'] 
                .value_counts() 
                .unstack(fill_value=0) 
                .add_prefix('label_'), 'user_id')) 

或使用 crosstab和 merge左连接:

df = (df.merge(pd.crosstab(df['user_id'], df['label']) 
                 .add_prefix('label_'), on='user_id', how='left')) 

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