如何对多指标宽表执行(un)pivot操作将指标转为单列存储?
你需要实现的是**逆透视(UNPIVOT / melt)**操作,和pivot(长表转宽表)是反向操作,作用是将宽表中多个指标列拆分为多行,正好匹配你的需求。
常用实现方式
SQL实现
如果使用支持UNPIVOT语法的数据库(PostgreSQL、BigQuery、Spark SQL等),可以直接用原生语法:
SELECT transaction_id, state, metric_name, flag FROM 你的原始表名 UNPIVOT ( flag FOR metric_name IN (metric_1, metric_2, metric_3) )
如果是不支持UNPIVOT的数据库(如MySQL),可以用UNION ALL实现相同效果:
SELECT transaction_id, state, 'metric_1' AS metric_name, metric_1 AS flag FROM 你的原始表名 UNION ALL SELECT transaction_id, state, 'metric_2' AS metric_name, metric_2 AS flag FROM 你的原始表名 UNION ALL SELECT transaction_id, state, 'metric_3' AS metric_name, metric_3 AS flag FROM 你的原始表名 ORDER BY transaction_id, metric_name
Python Pandas实现
使用pandas的melt方法即可直接完成转换:
import pandas as pd # df为读取原始宽表得到的DataFrame对象 result_df = df.melt( id_vars=["transaction_id", "state"], value_vars=["metric_1", "metric_2", "metric_3"], var_name="metric_name", value_name="flag" )
两种实现的输出结果和你给出的预期结构完全一致,会自动保留原始null值,每个transaction_id对应指标数量的行数。
内容的提问来源于stack exchange,提问作者samba
相关产品推荐
相关产品推荐

