将分组的聚合唯一列添加到熊猫数据框
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 并且计算效率更高。以上是关于将分组的聚合唯一列添加到熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章