如何在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
请问如何:
- 确保颜色列表无重复值;
- 统计每个颜色在原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
相关产品推荐
相关产品推荐

