将单列variable转换为6列:Google数据分析顶点项目数据重塑需求
将长格式数据集转换为宽格式(Google Data Analytics Capstone Project)
问题背景
你手头有一个86000行的长格式数据集,结构如下:
Date loc loc_type variable value --------------------------------------- 1 1 1 1 (num) 1 1 1 2 (num) 1 1 1 3 (num) 1 1 1 4 (num) 1 1 1 5 (num) 1 1 1 6 (num) 1 1 2 1 (num) ...
需要转换为宽格式,将variable列的1-6值转为独立列var1到var6,目标格式如下:
Date loc loc_type var1 var2 var3 var4 var5 var6 ------------------------------------------------------------------ 1 1 1 (num) (num) (num) (num) (num) (num) 1 1 2 (num) (num) (num) (num) (num) (num) ...
解决方案
以下是几种常用工具的实现方法,根据你的技术栈选择即可:
1. Python(Pandas)
这是处理这类数据转换最灵活的方式,适合大数据集(86000行完全没问题):
import pandas as pd # 读取数据集(假设是CSV文件,根据实际格式调整) df = pd.read_csv('your_dataset.csv') # 使用pivot_table转换宽格式,aggfunc='first'确保每个分组取唯一值(无重复时可用pivot) wide_df = df.pivot_table( index=['Date', 'loc', 'loc_type'], columns='variable', values='value', aggfunc='first' ).reset_index() # 重命名列,将1-6改为var1-var6 wide_df.columns = ['Date', 'loc', 'loc_type'] + [f'var{i}' for i in range(1,7)] # 保存结果 wide_df.to_csv('wide_dataset.csv', index=False)
- 如果数据中存在同一
Date+loc+loc_type+variable组合的重复值,可将aggfunc改为mean/sum等聚合函数处理。
2. Excel(数据透视表/Power Query)
适合不熟悉代码的用户:
方法A:数据透视表
- 选中整个数据集,点击「插入」→「数据透视表」
- 行区域拖入
Date、loc、loc_type;列区域拖入variable;值区域拖入value(值字段设置选「值」而非计数) - 调整透视表布局为「以表格形式显示」,手动修改列名为
var1到var6
方法B:Power Query(更高效)
- 选中数据集,点击「数据」→「从表格/区域」进入Power Query编辑器
- 选择
Date、loc、loc_type列,点击「转换」→「透视列」 - 透视列设置:值列选
value,高级选项选「不要聚合」(无重复值时),确定后自动生成宽格式,重命名列即可
3. SQL
如果数据存储在数据库中,可使用以下方法:
MySQL/PostgreSQL(CASE WHEN)
SELECT Date, loc, loc_type, MAX(CASE WHEN variable = 1 THEN value END) AS var1, MAX(CASE WHEN variable = 2 THEN value END) AS var2, MAX(CASE WHEN variable = 3 THEN value END) AS var3, MAX(CASE WHEN variable = 4 THEN value END) AS var4, MAX(CASE WHEN variable = 5 THEN value END) AS var5, MAX(CASE WHEN variable = 6 THEN value END) AS var6 FROM your_table GROUP BY Date, loc, loc_type;
SQL Server(PIVOT函数)
SELECT Date, loc, loc_type, [1] AS var1, [2] AS var2, [3] AS var3, [4] AS var4, [5] AS var5, [6] AS var6 FROM your_table PIVOT ( MAX(value) FOR variable IN ([1],[2],[3],[4],[5],[6]) ) AS pivot_table;
内容的提问来源于stack exchange,提问作者Marinos Kaitis
相关产品推荐
相关产品推荐

