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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:30:58