You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DataFrame分组后用nunique统计并保留被统计值的名称?

问题:分组统计唯一值时同时保留值数量和值列表

现有如下DataFrame:

import pandas as pd
df = pd.DataFrame({
    'name': ['a', 'a', 'a', 'b', 'b', 'b'],
    'type': ['first', 'first', 'second', 'first', 'first', 'first'],
    'value': ['10a', '7b', '9c', '5r', '7r', '9r']
})

执行df.groupby(["name", "type"]).nunique()后得到结果:

value
name type      
a    first     2
     second    1
b    first     3

希望得到同时包含唯一值数量和对应值列表的结果:

name   type    value  value_name
a     first     2      [10a, 7b]
a     second    1      [9c]
b     first     3      [5r, 7r, 9r]

解决方案

可以通过groupby.agg()方法一次性完成多维度聚合,或者分步生成结果,两种方式都能满足需求:

方法1:单步聚合操作

直接在agg()中指定两个聚合逻辑,分别生成唯一值数量和值列表:

result = df.groupby(["name", "type"])['value'].agg(
    value='nunique',
    value_name=lambda x: list(x.unique())
).reset_index()
  • value='nunique':统计每组value列的唯一值数量,列名设为value
  • value_name=lambda x: list(x.unique()):提取每组的唯一值并转为列表,列名设为value_name
  • reset_index():将分组的name和type从索引转回普通列(不需要的话可省略)

方法2:分步生成结果

先提取唯一值列表,再基于列表长度计算唯一值数量,逻辑更直观:

# 分组提取唯一值列表
temp = df.groupby(["name", "type"])['value'].unique().reset_index(name='value_name')
# 新增唯一值数量列
temp['value'] = temp['value_name'].apply(len)
# 调整列顺序(可选)
result = temp[['name', 'type', 'value', 'value_name']]

两种方法最终都能得到目标格式的结果。


内容的提问来源于stack exchange,提问作者user12314164

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:55:25