Python中如何实现数据分组后的去重统计_利用groupby配合nunique函数

胖枫酱_8249

胖枫酱_8249

2026-06-08

360人浏览

原创

groupby后需先选取列再调用nunique,如df.groupby('a')['b'].nunique();它返回每组中该列去重计数,默认忽略nan,多列统计用df.groupby('a')[['b','c']].nunique()。

python中如何实现数据分组后的去重统计_利用groupby配合nunique函数

groupby后直接用nunique会报错:'Series' object has no attribute 'nunique'

这个错误通常出现在你对 groupby 结果误用了 nunique——它不是 SeriesGroupBy 或 DataFrameGroupBy 对象的直接方法,而是作用于单个 Series 或 DataFrame 的。常见写法错误如:df.groupby('A').nunique()(错),或 df.groupby('A')['B'].nunique()(对)。

正确路径是:先 groupby 得到分组对象,再选取列(返回 SeriesGroupBy),最后调用 nunique。它本质是对每个分组内部的该列做去重计数。

  • df.groupby('category')['user_id'].nunique() → 返回每个 category 下不重复的 user_id 数量
  • 若想对多列分别统计去重数,写成 df.groupby('category')[['user_id', 'product_id']].nunique()
  • 注意:nunique 默认忽略 NaN;如需把 NaN 当作一个独立值计数,加参数 dropna=False

想统计每组中某列的「去重值列表」而非数量?别用nunique

nunique 只返回整数计数,不提供具体有哪些值。如果你需要每组的去重集合(比如查每个部门有哪些职级),得换方法:

Shadows Python Sensei
Shadows Python Sensei

Python 最佳实践助手——代码规范、设计模式、性能优化、测试与类型注解。适用于编写或审查 Python 代码。

下载
  • 用 .apply(set):df.groupby('dept')['role'].apply(set) → 返回每个 dept 对应的 set 对象
  • 用 .unique()(保留首次出现顺序):df.groupby('dept')['role'].unique() → 返回 numpy.ndarray,更常用
  • 两者都支持链式操作,但 .unique() 性能略好、结果可索引;set 无序且不可直接切片
  • 如果后续要转成字符串拼接(如“经理,主管”),推荐 .str.join() 配合 .unique():df.groupby('dept')['role'].unique().str.join(', ')

groupby + nunique在空组或全NaN组下的行为

当某组内目标列全部为 NaN(或为空),nunique 默认返回 0(因为 dropna=True 是默认值)。这容易造成误解——你以为该组有数据但去重后为 0,实际可能是全空。

  • 验证方式:对比 .count()(非空计数)和 .nunique(),若前者为 0 而后者非 0,说明有 NaN 被算进去了(仅当 dropna=False 时)
  • 安全做法:显式控制 dropna 参数,例如 df.groupby('tag')['id'].nunique(dropna=False),这样空组返回 1(把 NaN 算作一个值)
  • 注意:Pandas 1.1+ 中,nunique 对空 Series(长度为 0)始终返回 0,与 dropna 无关

性能敏感场景下,nunique比手动set慢吗?

是的,在小数据量上差异不大,但在百万级分组+高频调用时,nunique 内部做了类型推断和缺失值检查,比裸写 lambda x: len(set(x.dropna())) 慢 20%–40%。不过官方实现更健壮,推荐优先用 nunique,除非压测确认它是瓶颈。

  • 提速技巧:若已知列无 NaN,加 dropna=False 反而可能略快(跳过空值扫描逻辑)
  • 替代方案(仅限纯数值/字符串且确定无 NaN):df.groupby('key')['col'].apply(lambda x: x.nunique(dropna=False)) —— 实际并无收益,不建议
  • 真正有效的是预过滤:先 df = df.dropna(subset=['col']),再 groupby(...).nunique(),减少每组处理负担
nunique 的语义很干净:就是“每组里这一列有多少个不同值”。但它不告诉你这些值是什么、出现几次、有没有空——那些得靠 unique、value_counts 或 agg 配合自定义函数。别指望一个函数解决所有去重相关问题。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1571

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3764

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1589

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

21657

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2667

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2727

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1103

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2103

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程