将分组的聚合nunique列添加到pandas数据帧

wba*_*rts 5 python aggregate dataframe pandas pandas-groupby

我想在我的pandas数据帧中添加一个聚合的,分组的,nunique列,但不会聚合整个数据帧.我试图在一行中执行此操作,并避免创建新的聚合对象并合并它等.

我的df有track,type和id.我希望每个轨道/类型组合的唯一ID数量作为表格中的新列(但不会在生成的df中折叠轨道/类型组合).相同行数,1列.

这样的事情不起作用:

df['n_unique_id'] = df.groupby(['track', 'type'])['id'].nunique()
Run Code Online (Sandbox Code Playgroud)

也不是

df['n_unique_id'] = df.groupby(['track', 'type'])['id'].transform(nunique)
Run Code Online (Sandbox Code Playgroud)

最后一个适用于一些聚合函数,但不适用于其他函数.以下工作(但在我的数据集上没有意义):

df['n_unique_id'] = df.groupby(['track', 'type'])['id'].transform(sum)
Run Code Online (Sandbox Code Playgroud)

在R中,这很容易在data.table中完成

df[, n_unique_id := uniqueN(id), by = c('track', 'type')]
Run Code Online (Sandbox Code Playgroud)

谢谢!

piR*_*red 6

df.groupby(['track', 'type'])['id'].transform(nunique)
Run Code Online (Sandbox Code Playgroud)

意味着nunique名称空间中有一个名称可以执行某些功能. transform将获取它知道函数的函数或字符串. nunique绝对是其中一个字符串.

正如@root所指出的那样,通常pandas用于执行由这些字符串指示的转换的方法是优化的,并且通常应优先于传递您自己的函数.在某些情况下,这True甚至适用于传递numpy函数.

例如,transform('sum')应该优先考虑transform(sum).

试试这个

df.groupby(['track', 'type'])['id'].transform('nunique')
Run Code Online (Sandbox Code Playgroud)

演示

df = pd.DataFrame(dict(
    track=list('11112222'), type=list('AAAABBBB'), id=list('XXYZWWWW')))
print(df)

  id track type
0  X     1    A
1  X     1    A
2  Y     1    A
3  Z     1    A
4  W     2    B
5  W     2    B
6  W     2    B
7  W     2    B

df.groupby(['track', 'type'])['id'].transform('nunique')

0    3
1    3
2    3
3    3
4    1
5    1
6    1
7    1
Name: id, dtype: int64
Run Code Online (Sandbox Code Playgroud)

  • 我正准备对此发表评论.提及字符串别名通常应该是首选(如果可用)可能是有用的,因为它们将引用最佳函数,例如`.transform(sum)`使用python`sum`,而`.transfrom('sum')`会使用numpy并且计算效率更高. (4认同)