如何在Pandas中获取顺序无关的唯一颜色组合集合?
找出顺序无关的唯一颜色组合并统计对应人数
场景与问题
现有记录「人物-喜欢的颜色」的DataFrame,部分用户仅选择一种颜色,部分用户选择多种。需要:
- 识别出顺序无关的唯一颜色组合(比如
[black, red]和[red, black]视为同一组合) - 后续统计每种组合对应的用户人数
原始数据与初始尝试
生成DataFrame代码
import pandas as pd data_list=['black', 'red', 'red', 'black', 'red', 'white', 'blue', 'blue', 'purple', 'black', 'green', 'white', 'black', 'blue', 'red', ] names_list=['Michael', 'Michael', 'Tony', 'Tony', 'Helen', 'Margo', 'Max', 'John', 'Roxanne', 'Roxanne', 'Roxanne', 'Marla', 'Jack', 'Jack', 'Jack', ] df=pd.DataFrame(data=zip(names_list, data_list), columns=['Person', 'Colors'])
初始分组聚合
按Person分组聚合得到每个用户的唯一颜色列表:
user_color_groups = df.groupby('Person')['Colors'].unique()
得到结果:
Person Helen [red] Jack [black, blue, red] John [blue] Margo [white] Marla [white] Max [blue] Michael [black, red] Roxanne [purple, black, green] Tony [red, black]
遇到的问题
直接用集合去重时,集合不可哈希无法作为分组键;转元组则会因列表顺序不同被判定为不同组合(比如[black, red]和[red, black]),无法满足需求。
解决方案
核心思路:将每个用户的颜色列表排序后转成元组——排序后相同组合的列表会生成完全一致的元组,可作为可哈希的分组键,实现顺序无关的去重与统计。
完整处理代码
# 1. 按Person分组,获取每个用户的唯一颜色列表 user_colors = df.groupby('Person')['Colors'].unique().reset_index() # 2. 对颜色列表排序后转元组,生成统一标识的组合键 user_colors['color_combination'] = user_colors['Colors'].apply(lambda x: tuple(sorted(x))) # 3. 按组合键分组,统计每种组合的用户人数 result = user_colors.groupby('color_combination')['Person'].count().reset_index() # 重命名列名提升可读性 result.columns = ['color_combination', 'person_count'] # 输出统计结果 print(result)
统计结果输出
color_combination person_count 0 (red) 1 1 (black, red) 2 2 (black, blue, red) 1 3 (blue) 2 4 (white) 2 5 (black, green, purple) 1
获取唯一颜色组合列表
如果只需要提取顺序无关的唯一颜色组合,可将结果中的组合转成列表形式:
# 转成列表格式 unique_combinations = [list(comb) for comb in result['color_combination'].tolist()] print(unique_combinations)
输出符合预期的结果:
[['red'], ['black', 'red'], ['black', 'blue', 'red'], ['blue'], ['white'], ['black', 'green', 'purple']]
内容的提问来源于stack exchange,提问作者usualMortal
相关产品推荐
相关产品推荐

