将分组的聚合唯一列添加到熊猫数据框

Posted

技术标签:

【中文标题】将分组的聚合唯一列添加到熊猫数据框【英文标题】:Adding a grouped, aggregate nunique column to pandas dataframe 【发布时间】:2017-09-29 07:30:26 【问题描述】:

我想向我的 pandas 数据框添加一个聚合的、分组的、唯一的列,但不聚合整个数据框。我试图在一行中做到这一点,并避免创建一个新的聚合对象并合并它,等等。

我的 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】:
df.groupby(['track', 'type'])['id'].transform(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

【讨论】:

我正要对此发表评论。如果可用,通常应该首选字符串别名,因为它们将引用最佳函数,例如.transform(sum) 使用 python sum,而 .transfrom('sum') 将使用 numpy 并且计算效率更高。

以上是关于将分组的聚合唯一列添加到熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

为啥熊猫分组聚合丢弃分类列?

熊猫数据框根据名称对列进行分组并应用函数

熊猫数据框按列位置分组

将熊猫数据框按两列分组而不汇总

熊猫数据框列的分组和计数

熊猫将行值除以聚合总和,条件由其他单元格设置