如何获取产品分组中uom值的唯一组合?解决哈希报错问题
问题:获取产品UOM的唯一组合(顺序无关)
给定示例DataFrame:
import pandas as pd df = pd.DataFrame([{'prod_id':3,'uom':'PK'},{'prod_id':3,'uom':'PQT'},{'prod_id':4,'uom':'PK'},{'prod_id':5,'uom':'PQT'},{'prod_id':5,'uom':'PK'},{'prod_id':6,'uom':'SET'},{'prod_id':6,'uom':'ENS'},{'prod_id':7,'uom':'PK'},{'prod_id':7,'uom':'ENS'}])
需求是提取各产品对应的UOM组合,且顺序无关(如[PK, PQT]与[PQT, PK]视为同一组合)。
当前尝试用df.groupby(by='prod_id')['uom'].unique()获取每个产品的UOM组合,但对结果调用.unique()时触发错误:
TypeError: unhashable type: 'numpy.ndarray'
解决方案
错误原因
groupby('uom').unique()返回的是numpy数组,而数组属于不可哈希类型,pd.Series.unique()依赖哈希表实现去重,因此无法直接处理。要解决这个问题,需要将数组转换为可哈希的类型。
方法1:排序后转为元组(推荐,保证输出顺序一致)
将每个产品的UOM组合排序后转为元组(元组可哈希),这样顺序不同的等价组合会被标准化为相同的元组,再执行去重:
# 分组生成排序后的元组,统一等价组合的格式 uom_groups = df.groupby('prod_id')['uom'].apply(lambda x: tuple(sorted(x.unique()))) # 获取唯一组合 unique_combinations = uom_groups.unique() # 可选:将元组转回列表格式 unique_combinations = [list(item) for item in unique_combinations] print(unique_combinations)
输出结果:
[['PK', 'PQT'], ['PK'], ['ENS', 'SET'], ['ENS', 'PK']]
方法2:使用冻结集合(frozenset)
集合本身是无序的,冻结集合(frozenset)是可哈希的,可以直接用来去重:
# 分组生成冻结集合 uom_groups = df.groupby('prod_id')['uom'].apply(lambda x: frozenset(x.unique())) # 获取唯一组合 unique_combinations = uom_groups.unique() # 可选:转回列表格式(注意集合转列表后顺序不固定) unique_combinations = [list(item) for item in unique_combinations]
此方法无需排序,但最终列表的元素顺序无法保证,适合仅关注组合内容的场景。
内容的提问来源于stack exchange,提问作者Ramsay
相关产品推荐
相关产品推荐

