Pandas如何对多列逗号分隔的多选值进行组合分组计数
Pandas多选逗号分隔列跨列组合频次统计高效方案
实现思路
- 先将每个多选列的逗号分隔字符串转换为列表格式
- 调用pandas原生向量化方法
explode将列表拆分为独立行,自动保留同一条记录不同列取值的对应关系 - 对拆分完成的数据集直接做分组统计,即可得到所有非零值的组合频次
- 如需补全零计数的全分类组合,通过元数据生成多列分类的笛卡尔积后做重索引即可,全程无需遍历分类编码,性能远高于手动循环实现,可轻松支持单列数百个分类的2-3列组合统计
完整代码实现
首先导入依赖库,构造示例数据:
import pandas as pd import numpy as np # 原始示例数据 df = pd.DataFrame(np.array([["1,3","1"],["3","1,2"],["1,3,2","1"],["3,1","2,1"]]), columns=['a', 'b']) # 分类元数据示例 df_meta = { 'a': {'Categories': ['1', '2', '3','4']}, 'b': {'Categories': ['1', '2']} }
核心处理逻辑:
# 1. 将所有多选列的字符串转为列表 target_cols = ['a', 'b'] # 要统计的多选列,可按需修改 for col in target_cols: df[col] = df[col].str.split(',') # 2. 逐列拆分为多行,保留行关联 df_exploded = df for col in target_cols: df_exploded = df_exploded.explode(col) # 3. 分组统计非零组合的频次 count_result = df_exploded.groupby(target_cols).size().rename('count').reset_index() # 4. (可选)补全所有零计数的分类组合 all_cates = [df_meta[col]['Categories'] for col in target_cols] full_index = pd.MultiIndex.from_product(all_cates, names=target_cols) full_count_result = df_exploded.groupby(target_cols).size()\ .reindex(full_index, fill_value=0)\ .rename('count')\ .reset_index()
输出说明
- 若只需要非零计数结果,直接使用
count_result即可,其计算量仅和原始数据量相关,和分类总数无关,性能最优 - 若需要包含零计数的全量组合,使用
full_count_result,2个各400分类的变量全组合仅16万行,3个各100分类的变量全组合仅100万行,常规算力下均可轻松处理
内容的提问来源于stack exchange,提问作者pr0faka
相关产品推荐
相关产品推荐

