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

在Pandas/Python中统计嵌套类别组合并生成计数汇总表

问题解决:嵌套类别计数汇总表生成

目标

获取嵌套于另一类别中的各类别计数汇总表。

示例数据与编码

现有如下DataFrame:

# 初始化列表数据
data = {'Name': ['Tom', 'Tom', 'Tom', 'jack', 'jack', 'Mary', 'Mary', 'Mary', 'Jim', 'Jim'],
        'CEFR_level': ['A1', 'A2', 'PreA1', 'A2', 'A1','A1','B1','C1', 'A1', 'B1']}
 
# 创建DataFrame
df = pd.DataFrame(data)

# 类别编码代码:
Easy = ["PreA1","A1", "A2"]
Medium =["B1", "B2"]
Hard = ["C1", "C2"]

data ['CEFR_categories'] = np.where(data['CEFR_level'].isin(Easy), 'Easy',
                                               np.where(data['CEFR_level'].isin(Medium), 'Medium',
                                                        np.where(data ['CEFR_level'].isin(Hard), 'Hard', 'Other')))

已成功生成CEFR_categories列,将CEFR_level正确归类为Easy、Medium、Hard,但在groupby操作中遇到问题。

需求

已完成将CEFR等级编码为Easy/Medium/Hard,接下来需按Name分组,统计各类别组合的出现次数:

  • 仅含Easy的组合出现2次(Tom和Jack的CEFR_level均属于Easy);
  • Easy-Medium-Hard组合出现1次(Mary的CEFR_level覆盖三类);
  • Easy-Medium组合出现1次(Jim的CEFR_level覆盖两类)。

尝试多次编码仅能为每行生成单个类别,无法得到组合统计。期望输出格式如下:
期望输出

问题更新

使用@Timeless的方案后输出不符合预期,例如实际数据中存在Easy-Medium组合,但输出显示计数为0。

最终可用代码

from itertools import powerset  # 需提前导入依赖

cats = sorted(testlet_item_bank["CEFR_categories"].unique()) 
# status = dict(zip(cats, ["Easy", "Medium", "Hard"])) # 该代码会混淆类别

# 生成所有非空的类别组合
ps = list(map("-".join, powerset(cats)))[1:]

out = (
      testlet_item_bank # 首个链式调用可选
      .astype({"CEFR_categories": pd.CategoricalDtype(cats, ordered=True)})
      .groupby("TestletID")["CEFR_categories"]
      .agg(lambda x: "-".join(pd.unique(x.sort_values())))
      .value_counts()
      .reindex(ps, fill_value=0)
      .rename_axis("Categories")
      .reset_index(name="Counts")
#    .replace(status, regex=True) 该代码会混淆类别
)

内容的提问来源于stack exchange,提问作者Juan Carlos Saravia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:42:52