[英]Adding a grouped, aggregate nunique column to pandas dataframe
我想向我的 Pandas 数据框添加一个聚合的、分组的、唯一的列,但不聚合整个数据框。 我试图在一行中做到这一点,并避免创建一个新的聚合对象并合并它等等。
我的 df 有轨道、类型和 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
名称空间中有一个名称nunique
执行某些功能。 transform
将采用一个函数或一个它知道函数的字符串。 nunique
绝对是这些字符串之一。
正如@root 所指出的, pandas
用来执行由这些字符串指示的转换的方法通常是经过优化的,通常应该优先于传递您自己的函数。 这是True
甚至通过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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.