Python分组统计唯一值并保存至新列的问题排查与实现
解决分组统计唯一值并生成
counts列的问题 问题分析
使用transform('nunique')得到全NaN,大概率是因为分组列(A、B)中存在缺失值(NaN)——pandas的groupby默认会排除包含NaN的分组,导致这部分行无法匹配到统计结果,最终填充为NaN。而直接调用nunique()时,默认也不会显示包含NaN的分组,所以你能看到的是有效分组的统计值。
可行解决方案
方案1:处理分组列的缺失值(推荐)
如果分组列的NaN是无效数据,先清理缺失值:
# 删除A/B列含NaN的行 df_clean = df.dropna(subset=["A", "B"]) # 生成counts列 df_clean['counts'] = df_clean.groupby(["A","B"])["C"].transform('nunique')
如果NaN是有意义的(比如代表"未知"分组),可以先填充标识值:
# 将A/B列的NaN替换为"Unknown" df[["A", "B"]] = df[["A", "B"]].fillna("Unknown") df['counts'] = df.groupby(["A","B"])["C"].transform('nunique')
方案2:用merge关联统计结果
如果不想处理缺失值,可以先生成带列名的统计结果,再合并回原表:
# 统计并设置列名 group_counts = df.groupby(["A","B"])["C"].nunique().reset_index(name='counts') # 合并回原表,保留所有行(含分组列有NaN的行) df = df.merge(group_counts, on=["A","B"], how='left')
这种方式会把原表中无法匹配分组的行的counts设为NaN,你可根据需求后续处理这些值。
方案3:升级pandas版本(针对旧版本bug)
如果你的pandas版本低于1.3.0,transform('nunique')可能存在兼容性问题,升级到最新稳定版即可解决:
pip install --upgrade pandas
后续排名操作示例
生成counts列后,按组对唯一值数量排名可参考以下代码:
# 按A、B分组,对counts列降序排名(相同值取相同排名) df['rank'] = df.groupby(["A","B"])['counts'].rank(method='dense', ascending=False)
内容的提问来源于stack exchange,提问作者Allison
相关产品推荐
相关产品推荐

