繁体   English   中英

将分组的聚合 nunique 列添加到 Pandas 数据框

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM