在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
相关产品推荐
相关产品推荐

