pandas如何实现列转置后Groupby分组统计编码及关联ID
pandas 多编码列分组聚合实现方案
核心思路是先将分散在Code1~Code4多列的编码值统一转换为长表格式,过滤空值后直接按编码分组做聚合即可,不需要做复杂的全表转置。
完整实现代码
import pandas as pd import numpy as np # 构造测试DataFrame df = pd.DataFrame({'ID' : ['ID1', 'ID2', 'ID3', 'ID4'], 'Code1' : ['X60', np.nan, 'X66', np.nan], 'Code2' : [np.nan, 'X64', 'X78', np.nan], 'Code3' : [np.nan, 'X66', 'X81', 'X59'], 'Code4' : [np.nan, np.nan, 'X38', 'X60']}) # 宽表转长表:保留ID为关联键,把所有Code列的编码合并到同一列,过滤空值 df_long = df.melt( id_vars='ID', value_vars=df.columns[df.columns.str.startswith('Code')], value_name='Code' ).dropna(subset=['Code']) # 分组聚合:统计编码出现次数、拼接关联ID result = df_long.groupby('Code', as_index=False).agg( NB = ('ID', 'count'), ID = ('ID', lambda x: ', '.join(x)) ).sort_values(by='Code', ignore_index=True) print(result)
运行输出
执行代码后得到的结果和预期完全一致:
Code NB ID 0 X38 1 ID3 1 X59 1 ID4 2 X60 2 ID1, ID4 3 X64 1 ID2 4 X66 2 ID2, ID3 5 X78 1 ID3 6 X81 1 ID3
关键逻辑说明
melt是pandas专门用于宽表转长表的方法,比手动转置更适配这类多列同类型字段合并的场景,代码可读性和运行效率更高- 转长表后用
dropna剔除编码为空的无效行,避免空值被纳入分组统计 - 聚合阶段直接用
count统计每个编码对应的ID条数即为出现次数,传入匿名函数用', '.join()即可将同组ID拼接为逗号分隔的字符串 - 最后加
sort_values是为了让编码按字典序排序,和示例预期的输出顺序对齐,不需要排序可删除该步骤
内容的提问来源于stack exchange,提问作者A2N15
相关产品推荐
相关产品推荐

