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

如何在Pandas中实现颜色列去重并统计其在原DataFrame中的出现次数

问题描述

我有一个包含produce(农产品)列和colors(颜色列表)列的Pandas DataFrame:

import pandas as pd

data = {'produce':['zucchini','apple','citrus','banana','pear'],
      'colors':['green, yellow','green, red, yellow','orange, yellow ,green','yellow','green, yellow, brown']}
df = pd.DataFrame(data)
print(df)

输出的DataFrame如下:

produce                 colors
0  zucchini          green, yellow
1     apple     green, red, yellow
2    citrus  orange, yellow, green
3    banana                 yellow
4      pear   green, yellow, brown

我想要创建第二个DataFrame,包含每个唯一颜色,并统计该颜色在第一个DataFrame中的出现次数。

我尝试提取唯一颜色到新DataFrame:

# 创建包含唯一值的DataFrame
unique_colors = df['colors'].str.split(",").explode().unique()
df2 = pd.DataFrame()
df2['Color'] = unique_colors
print(df2)

但结果出现重复值(实际是因为颜色字符串带前后空格,被识别为不同值):

Color
0    green
1   yellow
2      red
3   orange
4    green
5   yellow
6    brown

同时尝试添加计数列时出现错误ValueError: Length of values (0) does not match length of index (5),尝试的代码如下:

# df['Count'] = data['colors'] == df2['Color']
df['Count'] = ()
for i in df2['Color']:
      count=0
      if df["colors"].str.contains(i):
            count+1
      df['Count']=count

请问如何:

  1. 确保颜色列表无重复值;
  2. 统计每个颜色在原DataFrame中的出现次数?
    (注:这是大型DataFrame的简化场景,无法直接编辑原DataFrame来修复重复问题)

解决方案

核心问题分析

你遇到的重复值本质是颜色字符串存在前后空格(比如" yellow "和"yellow"被视为不同值),而循环计数的方法不仅效率极低(不适合大型DataFrame),还存在逻辑错误(count+1未赋值、赋值方式错误)。

高效实现方法

以下方法无需修改原DataFrame,直接处理颜色列,同时完成去重和计数:

1. 一步生成含唯一颜色及计数的DataFrame

import pandas as pd

# 拆分颜色列,清理每个颜色的前后空格,展开为单行单颜色的序列
color_series = df['colors'].str.split(',', expand=True).stack().str.strip()

# 统计每个颜色的出现次数,自动去重并生成结果DataFrame
color_counts_df = color_series.value_counts().reset_index()
# 重命名列名
color_counts_df.columns = ['Color', 'Count']

print(color_counts_df)

输出结果:

Color  Count
0  yellow      4
1   green      3
2     red      1
3  orange      1
4   brown      1

2. 分步实现(如需单独获取唯一颜色列表)

如果需要先单独得到无重复的颜色列表,再添加计数:

# 拆分、清理、展开颜色列
color_series = df['colors'].str.split(',', expand=True).stack().str.strip()

# 获取无重复的颜色列表
unique_colors = color_series.unique()
df2 = pd.DataFrame({'Color': unique_colors})

# 添加计数列:通过map匹配每个颜色的出现次数
df2['Count'] = df2['Color'].map(color_series.value_counts())

print(df2)

关键细节说明

  • 清理空格:使用str.strip()去除每个颜色字符串的前后空格,确保" green"和"green"被识别为同一颜色。
  • 高效统计:value_counts()是Pandas内置的高效统计方法,比手动循环快几个数量级,完全适配大型DataFrame场景。
  • 避免误匹配:拆分后展开为单行单颜色的序列,避免了str.contains()可能带来的子串匹配错误(比如不会把"light green"统计为"green")。

内容的提问来源于stack exchange,提问作者Smashley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:20:34