如何按seq_num聚合行,将code、val字段透视生成目标表格
表格透视转换实现方案
核心实现逻辑
- 按
seq_num字段分组,同一分组内所有行的非code、非val字段取值完全一致,直接取任意一行的对应值留存即可 - 遍历同分组内的所有行,将
code字段的取值作为新列名,对应的val字段取值作为该列在当前seq_num行下的数值 - 最后按「seq_num + 所有提取的code列 + 其他原有公共字段」的顺序拼接成最终表格
Python Pandas 实现
假设原始数据已读入为DataFrame对象df:
import pandas as pd # 提取所有公共字段:排除分组键seq_num、透视字段code和val之外的全部字段 common_fields = [col for col in df.columns if col not in ['seq_num', 'code', 'val']] # 执行透视操作 pivot_df = df.pivot_table( index=['seq_num'] + common_fields, columns='code', values='val', aggfunc='first' # 同一seq_num+code组合取值唯一,直接取第一个值即可 ).reset_index() # 可选:调整列顺序匹配需求输出格式 final_cols = ['seq_num'] + df['code'].unique().tolist() + common_fields pivot_df = pivot_df[final_cols]
SQL 实现
假设原始数据表名为raw_table,固定code值场景下直接用case when聚合:
SELECT seq_num, MAX(CASE WHEN code = 'author' THEN val END) AS author, MAX(CASE WHEN code = 'book' THEN val END) AS book, field1, field2, field3... -- 所有公共字段直接列出即可 FROM raw_table GROUP BY seq_num, field1, field2, field3... -- 所有公共字段都放入GROUP BY子句
如果code值不固定需要动态生成列,可根据数据库类型选用对应动态语法:MySQL用预处理语句、PostgreSQL用crosstab函数、Spark SQL用pivot语法均可实现。
前端JavaScript 实现
如果原始数据为前端数组格式,可直接用函数处理:
function pivotRawData(rawData) { const seqGroup = {} const codeSet = new Set() let commonFields = [] rawData.forEach(row => { const seq = row.seq_num codeSet.add(row.code) // 首次处理当前seq时初始化分组,留存公共字段 if (!seqGroup[seq]) { seqGroup[seq] = { seq_num: seq } commonFields = Object.keys(row).filter(k => !['seq_num', 'code', 'val'].includes(k)) commonFields.forEach(field => seqGroup[seq][field] = row[field]) } // 写入code对应的val值 seqGroup[seq][row.code] = row.val }) // 按要求顺序返回处理后的对象数组 const finalColOrder = ['seq_num', ...Array.from(codeSet), ...commonFields] return Object.values(seqGroup).map(item => finalColOrder.reduce((res, col) => { res[col] = item[col] return res }, {})) }
内容的提问来源于stack exchange,提问作者EviSvil
相关产品推荐
相关产品推荐

