首页 文章

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

提问于
浏览
3

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

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

这样的事情不起作用:

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

也不是

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

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

df['n_unique_id'] = df.groupby(['track', 'type'])['id'].transform(sum)

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

df[, n_unique_id := uniqueN(id), by = c('track', 'type')]

谢谢!

1 回答

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

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

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

    例如, transform('sum') 应优先于 transform(sum) .

    试试这个

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

    demo

    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
    

相关问题