如何在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列的唯一值数量,列名设为valuevalue_name=lambda x: list(x.unique()):提取每组的唯一值并转为列表,列名设为value_namereset_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
相关产品推荐
相关产品推荐

