python:如何基于另一个列分别求和一个dataframe列的唯一元素

时间:2018-07-10 12:57:57

标签: python pandas dataframe

例如,我有一个包含两列的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列中,我基于0列计算了label列中user_id的数量。

希望获得帮助!

1 个答案:

答案 0 :(得分:6)

想法是由groupby使用sizevalue_counts创建助手DataFrame,然后将unstackjoin创建为原始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'))

或在左联接中使用crosstabmerge

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