我想在我的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')]
谢谢!
解决方法:
df.groupby(['track', 'type'])['id'].transform(nunique)
意味着在名称空间中有一个名称nunique执行某些功能. transform将采用它知道函数的函数或字符串. nunique绝对是其中之一.
正如@root所指出的那样,pandas用于执行由这些字符串指示的转换的方法通常是优化的,并且通常应优先于传递自己的函数.即使在某些情况下传递numpy函数也是如此.
例如,transform(‘sum’)应优先于transform(sum).
试试这个
df.groupby(['track', 'type'])['id'].transform('nunique')
演示
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