Pandas按category分类统计names列的唯一值及对应数量
问题需求
现有包含两列的数据集,数据样例如下:
category names vegetables [broccoli, ginger] fruit [apple, grapes, dragonfruit] vegetables [pine] vegetables [bottleguord, pumpkin] fruit [mango, guava]
需要完成两个需求:
- 找出每个category分类下包含的所有唯一值
- 统计各分类唯一值的数量
测试数据集构建代码
import numpy as np import pandas as pd df = pd.DataFrame({ 'category':['vegetables', 'fruit', 'vegetables', 'vegetables', 'fruit'], 'Names':['[broccoli, ginger]','[apple, grapes, dragonfruit]','[pine]','[bottleguord, pumpkin]', '[mango, guava]'] })
最初代码问题说明
你最初写的实现代码无法得到正确结果:
g = df.groupby('category')['names'].apply(lambda x: list(np.unique(x)))
原因是数据集里的Names列存储的是字符串格式的列表,不是Python原生列表,直接对该列分组去重会把一整个字符串当成单个值处理,不会拆分内部的元素。
正确实现方案
你调整后的代码思路是对的,核心逻辑是先把字符串列表转成原生列表、拆分成单行单值之后再分组统计,还可以优化写法同时输出唯一值列表和统计数量,完整可运行代码如下:
import numpy as np import pandas as pd # 构建测试数据集 df = pd.DataFrame({ 'category':['vegetables', 'fruit', 'vegetables', 'vegetables', 'fruit'], 'Names':['[broccoli, ginger]','[apple, grapes, dragonfruit]','[pine]','[bottleguord, pumpkin]', '[mango, guava]'] }) result = ( # 去掉字符串两端的方括号,按逗号拆分为列表 df.assign(Names = df['Names'].str.strip('[]').str.split(', ')) # 把列表拆分为多行,每行对应一个值 .explode('Names') # 按category分组 .groupby('category', as_index=False) # 同时统计唯一值列表和数量 .agg( 唯一值列表=('Names', lambda x: list(set(x))), 唯一值数量=('Names', 'nunique') ) # 按要求替换分类名称、设置为索引 .replace({'category': {'vegetables': 'Vegetables', 'fruit': 'Fruits'}}) .set_index('category') ) print(result)
输出结果
唯一值列表 唯一值数量 category Vegetables [pine, ginger, pumpkin, broccoli, bottleguord] 5 Fruits [dragonfruit, grapes, apple, guava, mango] 5
注:你之前得到的Fruits分类唯一值数量为4属于统计错误,实际该分类下共有5个唯一值
内容的提问来源于stack exchange,提问作者chixcy
相关产品推荐
相关产品推荐

