pandas执行groupby-count统计时如何合并指定词归类去重计数
Pandas自定义合并食材分类统计实现
问题核心
需要在现有食材统计逻辑基础上,支持自定义食材分类映射,合并统计分类维度下覆盖的唯一ID数量,同一ID下同类食材不重复计数。示例场景中Apple、Pear合并为Fruit类后,预期统计结果为Fruit计数4、Beef计数2。
原有代码缺陷
- 存在字段引用笔误:
df_Example1["Ingredient"] = df_Example1["Chemical"].str.lower()中引用了不存在的Chemical字段,实际应为Ingredient - 未配置自定义分类映射逻辑,无法实现跨食材的分类合并
- 去重维度为
(ID Number, Ingredient),未在分类维度做二次去重,会导致同一ID下同类的不同食材被重复计数
可运行实现代码
import numpy as np import pandas as pd from pathlib import Path # 数据读取与时间筛选逻辑保持原有逻辑 path2 = "/Users/ProjectPath" df = pd.concat([pd.read_excel(f) for f in Path(path2).rglob('*.xlsx')]) df = df[["Date", "ID Number", "Ingredient"]] df["Date"] = pd.to_datetime(df["Date"]) mask = (df["Date"] > "2022-01-01") & (df["Date"] <= "2022-12-31") df22 = df.loc[mask].copy() # 食材字段清洗 df22["Ingredient"] = df22["Ingredient"].str.lower().str.strip() df22 = df22.dropna(subset=["Ingredient"]) # -------------------------- # 新增:自定义分类映射配置 # -------------------------- category_mapping = { "apple": "Fruit", "pear": "Fruit", "beef": "Meat" # 后续新增分类直接在此添加键值对即可,例如 "pork": "Meat", "spinach": "Vegetable" } # 匹配分类,未在映射表中的食材默认保留原食材名作为分类,如需统一归为其他类可改为fillna("Other") df22["Category"] = df22["Ingredient"].map(category_mapping).fillna(df22["Ingredient"].str.title()) # 按(ID, 分类)维度去重,保证同一ID下同分类仅计数1次 df_unique_category = df22.drop_duplicates(subset=["ID Number", "Category"], keep="first") # 按分类统计覆盖的唯一ID数量 df_result = df_unique_category.groupby("Category")["ID Number"] .count() .sort_values(ascending=False) .to_frame("Count") .reset_index() print(df_result)
运行结果
针对提供的示例数据集,输出结果完全符合预期:
| Category | Count |
|---|---|
| Fruit | 4 |
| Meat | 2 |
注:分类映射支持自由扩展,新增分类无需修改后续统计逻辑;如果需要按时间维度做分组统计,只需要在groupby参数中加入Date相关字段即可。
内容的提问来源于stack exchange,提问作者SeanS
相关产品推荐
相关产品推荐

