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

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)

运行结果

针对提供的示例数据集,输出结果完全符合预期:

CategoryCount
Fruit4
Meat2

注:分类映射支持自由扩展,新增分类无需修改后续统计逻辑;如果需要按时间维度做分组统计,只需要在groupby参数中加入Date相关字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:18:38