如何在Python中按日期将列转换为行(宽表转长表)
宽表转长表的实现方法
针对你需要将包含分组前缀的宽表转换为长表的需求,以下是几种可行的实现方式:
1. Excel/Power Query(无需编程)
- 将原数据导入Excel,选中数据区域,点击「数据」选项卡中的「从表格/区域」,进入Power Query编辑器。
- 复制当前查询(避免修改原数据),分别处理AA和BB分组:
- 对于AA分组:保留
Date和所有以AA_开头的列,添加自定义列Data并赋值为"AA",然后将所有AA_开头的列重命名,去掉前缀(比如AA_ZZ_CR改为ZZ_CR)。 - 对于BB分组:重复上述操作,保留
Date和BB_开头的列,自定义列Data赋值为"BB",重命名列去掉BB_前缀。
- 对于AA分组:保留
- 将两个处理后的查询合并(点击「追加查询」→「追加两个表」),最后关闭并上载到Excel即可。
2. Python pandas(编程实现)
使用pandas的wide_to_long函数可以快速实现这种带前缀的宽表转长表:
import pandas as pd # 读取原数据(假设数据存储在csv文件中,也可直接传入DataFrame) df = pd.read_csv("your_data.csv") # 转换格式 result = pd.wide_to_long( df, stubnames=["ZZ_CR", "ZZ_BT", "XX_CR", "XX_BT"], i="Date", j="Data", sep="_", suffix=r"\w+" ).reset_index() # 查看结果 print(result)
该函数会自动根据列名的前缀(AA/BB)拆分出Data列,并将对应后缀的列对齐。
3. SQL(数据库场景)
如果数据存储在数据库中,可以通过UNION ALL将AA和BB的行分别查询后合并:
SELECT Date, 'AA' AS Data, AA_ZZ_CR AS ZZ_CR, AA_ZZ_BT AS ZZ_BT, AA_XX_CR AS XX_CR, AA_XX_BT AS XX_BT FROM your_table UNION ALL SELECT Date, 'BB' AS Data, BB_ZZ_CR AS ZZ_CR, BB_ZZ_BT AS ZZ_BT, BB_XX_CR AS XX_CR, BB_XX_BT AS XX_BT FROM your_table ORDER BY Date, Data;
执行该SQL语句后,即可得到目标格式的结果。
内容的提问来源于stack exchange,提问作者Divyansh Kumar Singh
相关产品推荐
相关产品推荐

