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

如何获取产品分组中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:02:52