Pandas如何不分组按另一列去重计数计算指定列平均值
pandas 实现 sum(A)/count(distinct B) 计算逻辑的规范方案
你当前的实现逻辑是成立的,只需要把手动计算唯一值长度的部分替换为pandas原生接口,就可以得到更严谨、更符合pandas设计规范的写法,全程不需要使用groupby操作,也可以直接输出你要求的仅含目标列、单行存储结果的DataFrame。
核心优化点
- 替换唯一值计数逻辑:你当前使用的
len(df['CustomerID'].unique())可以替换为pandas内置的Series.nunique()方法,这是官方专门提供的唯一值计数接口,默认自动排除空值,性能和鲁棒性都优于手动取unique()后计算长度的写法。 - 结果格式适配:直接通过DataFrame构造方法包装计算结果,即可得到符合要求的输出结构。
完整实现代码
首先复现你的样例数据:
import pandas as pd df = pd.DataFrame({ 'OrderQuantity': [10, 9, 8, 14, 3], 'CustomerID': [1214, 1214, 1213, 1213, 1213] })
核心计算逻辑:
# 计算逻辑:sum(OrderQuantity) / count(distinct CustomerID) result = pd.DataFrame({ 'OrderQuantity': [df['OrderQuantity'].sum() / df['CustomerID'].nunique()] })
输出的result结果如下,完全符合你要求的格式:
OrderQuantity 0 22.0
参数说明
如果你的分类列(示例中的CustomerID)存在空值,且业务上需要将空值视为一个独立分类参与计数,可以给
nunique()传入dropna=False参数,即写为df['CustomerID'].nunique(dropna=False),该场景下默认的len(unique())写法虽然也会将NaN计为一个值,但不支持灵活调整是否排除空值,适配性弱于原生接口。
内容的提问来源于stack exchange,提问作者Judy T Raj
相关产品推荐
相关产品推荐

