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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:15:47