Python如何统计分组内不重复的元素个数_聚合时指定nunique统计函数
Python分组去重计数:掌握nunique()函数,提升数据分析效率
在数据分析工作中,按组统计唯一值数量是一项常见且关键的任务。例如,分析每个产品类别下的独立访客数,或计算每个销售区域每年上架的不同商品种类。此时,pandas库中的nunique()函数便成为高效解决此类问题的首选工具。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
nunique()是pandas中专门用于分组后计算唯一值数量的聚合方法。默认情况下自动忽略NaN空值,可通过dropna=False参数将NaN视为一个独立类别。使用时需明确指定目标列,且不适用于列表、字典等不可哈希的数据类型。

使用groupby结合nunique()快速实现分组去重统计
在pandas.DataFrame.groupby进行分组聚合操作时,直接调用nunique()方法是为“唯一值计数”场景量身定制的解决方案。相比先使用unique()获取唯一值列表再用len()计算长度的传统方法,它更加简洁且性能更优,尤其在处理缺失值NaN时拥有清晰的默认逻辑——自动排除。
首先需要明确一个常见误区:切勿将nunique()与count()或size()混淆。后两者分别统计非空值数量和总行数,均不具备去重功能。
- NaN缺失值处理:
nunique()默认忽略所有NaN值。若业务分析中需要将“空值”作为一个独立的分类进行统计,只需设置参数dropna=False即可。 - 支持的列数据类型:该函数对数值型列和字符串列均可直接使用。但需注意,如果目标列包含列表、字典等可变嵌套结构,直接调用会引发
TypeError: unhashable type错误。 - 执行效率对比:相较于使用
apply(lambda x: x.nunique())这种通用但效率较低的方式,直接调用内置的nunique()方法在处理大规模数据集时能显著提升计算速度。
单列分组与单目标列统计:基础应用模式
这是最典型的使用场景。例如,按照category(产品类别)进行分组,并统计每个类别下有多少个不同的user_id(用户ID):
df.groupby('category')['user_id'].nunique()
上述代码将返回一个pandas.Series对象,其索引为各个分组类别,对应的值为该组内用户ID的去重计数。若希望将结果转换为标准的DataFrame格式,可在其后链式调用.reset_index(name='nunique_user')进行重置。
立即学习“Python免费学习笔记(深入)”;
- 关于NaN的补充说明:若目标列中存在大量
NaN,且业务逻辑要求将“空用户ID”视为一种有效状态,务必使用.nunique(dropna=False)。 - 关键操作细节:必须准确指定目标列。错误地写成
df.groupby('category').nunique()会导致对所有数值列进行去重计数,而非仅针对某一列。务必使用['col']或[['col']]的语法来明确指定需要统计的列。
多列分组与多目标列分别统计:进阶聚合分析
面对更复杂的分析需求,例如需要同时按照“地区”和“年份”进行双重分组,并分别计算“产品ID”、“卖家ID”和“国家”的唯一值数量时,可以通过字典形式将聚合规则传递给agg()函数,使代码逻辑清晰明了:
df.groupby(['region', 'year']).agg({
'product_id': 'nunique',
'seller_id': 'nunique',
'country': 'nunique'
})
执行后将得到一个具有多层索引(MultiIndex)的DataFrame,其列名为之前指定的各个字段,数值则为对应的nunique统计结果。
- 代码书写规范:聚合字典中的字段名和聚合函数名均需使用引号包裹(例如
'nunique')。若遗漏引号直接书写nunique,将引发NameError错误。 - 混合聚合操作:若需对同一列同时计算唯一值数量和最大值,可写作
'product_id': ['nunique', 'max']。但需注意,这样生成的列名会变为多级索引。 - 代码风格建议:尽量避免在同一个
agg字典中混合使用字符串函数名和lambda表达式。虽然{'a': 'nunique', 'b': lambda x: x.nunique()}的写法可以执行,但在代码可读性和执行性能上,统一使用字符串函数名是更佳的选择。
解决“unhashable type”不可哈希类型错误
这是使用nunique()时可能遇到的一个典型障碍。当目标列的数据类型为列表(list)、字典(dict)或集合(set)等不可哈希(unhashable)的类型时,直接调用会抛出TypeError: unhashable type: 'list'异常。其根本原因在于nunique()的底层实现依赖于set()进行去重,而列表等可变类型无法直接作为集合的元素。
解决方案并非修改函数本身,而是在调用前将数据转换为可哈希的表示形式:
- 列表列的处理:若列表内的元素本身可哈希(如字符串、数字),可将其转换为元组(
tuple)。例如:df['tags_tuple'] = df['tags'].apply(lambda x: tuple(x) if isinstance(x, list) else None),然后对生成的tags_tuple列使用nunique()。 - 字典列的处理:可考虑进行序列化。例如使用
frozenset(dict.items()),或更稳健地使用json.dumps(sorted(dict.items()))将其转换为JSON字符串(对字典项排序是为了确保顺序一致,避免因键的顺序不同导致相同的字典被误判为不同值)。 - 通用替代方案:如果数据转换较为复杂,一个更直接但效率稍低的方法是:先基于分组键和目标列进行去重(使用
drop_duplicates),然后再进行分组计数。例如:df.drop_duplicates(['group_col', 'target_col']).groupby('group_col').size()。
总结来说,nunique()函数虽看似简单,但目标列的数据类型、NaN值的处理方式以及对嵌套数据结构的应对策略是三个最易出错的环节。在实际应用中,养成良好的数据探查习惯,先通过df['col'].dtype查看数据类型,并用df['col'].head()预览数据样本,往往能事半功倍,有效避免踩坑。
相关攻略
Python怎么将多个特征处理步骤组合_FeatureUnion合并多种提取器 FeatureUnion 在 scikit-learn 中早已被弃用 先说一个明确的结论:FeatureUnion 这个工具,从 scikit-learn 1 2 版本开始就被官方标记为弃用(deprecated)了。如
Python如何监听全局键盘按键实现自动化快捷键触发 你是否希望在Python中设置一个全局快捷键?例如,无论你当前正在编辑文档、浏览网页还是运行游戏,只需按下Ctrl+Shift+X这样的组合键,就能自动执行预设的自动化任务。这个需求听起来直观,但在实际开发中,会面临跨平台兼容性、系统权限以及逻辑
Python分组去重计数:掌握nunique()函数,提升数据分析效率 在数据分析工作中,按组统计唯一值数量是一项常见且关键的任务。例如,分析每个产品类别下的独立访客数,或计算每个销售区域每年上架的不同商品种类。此时,pandas库中的nunique()函数便成为高效解决此类问题的首选工具。 nun
Tesseract OCR 识别失败的核心原因在于输入图像质量不佳且缺乏针对性预处理。必须进行二值化、形态学去噪、倾斜校正等操作,并配合使用 --psm 8 参数和字符白名单;通过 Python 调用时需显式传递配置参数,在 Windows 系统上还需指定 tesseract_cmd 路径;调试过程
Python对象销毁机制详解:__del__析构函数与垃圾回收的正确使用 Python中__del__方法的局限性:为何它不是可靠的销毁钩子 需要明确的是,Python的__del__方法**无法保证一定会被执行**,因此不适合用于释放文件句柄、网络连接或数据库事务等关键系统资源。它仅仅是CPyth
热门专题
热门推荐
荣耀400 Pro正确关机全指南:从常规操作到故障应对详解 需要关闭您的荣耀400 Pro手机?日常操作其实非常简便。只需长按位于机身右侧的电源键约3秒钟,屏幕上便会浮现一个简洁的半透明菜单,其中明确列出了“关机”、“重启”以及“紧急呼叫”选项。直接点击“关机”,系统将启动一次10秒的安全倒计时,随
红米K30 Pro后盖拆解教程:专业工具与细致手法的完美结合 红米K30 Pro的后盖采用了高强度背胶配合隐藏式螺丝的双重固定设计,想要实现无损拆解,绝非依靠蛮力可以完成。整个操作流程对加热温度、撬启手法以及清洁标准都有严格要求,任何环节的疏忽都可能导致部件损伤。具体而言,其后盖边缘使用了耐高温的工
无需Root权限:三星Galaxy Z Flip系列电量数字显示设置全解析 很多三星折叠屏手机用户都想知道,如何在状态栏直接查看精确的电池百分比数字,是否必须获取Root权限才能实现?实际上完全不需要。三星自Galaxy Z Flip 5、Z Flip 4等主流机型开始,已在系统层面内置了这一实用功
笔记本开机自检信息虽不直接标注“DDR3”或“DDR4”,但联想、戴尔、华硕等品牌BIOS画面常以“PC3-”或“PC4-”编码间接揭示内存代际。UEFI自检显示的内存频率(如2400MHz 3200MHz)结合JEDEC规范可辅助推断:PC3对应DDR3,PC4对应DDR4。更高精度的识别方案包括
空调制冷不足怎么办?先别急着维修压缩机,这些问题更常见 夏天开空调却感觉不够凉爽?很多朋友的第一反应是压缩机坏了,其实压缩机故障的概率相对较低。根据维修行业的大数据统计,绝大多数制冷效果不佳的情况,源于几个容易被忽略的日常维护与环境因素。滤网积尘、制冷剂泄漏、外机散热不良才是真正的高发原因。盲目更换





