如何使用Pandas将指定范围的重复列转置为行
宽表转长表(复合列名拆分)解决方案
问题背景
现有如下结构的宽表:
| Month | power art | unit | energy_1 (2018) | energy_2 (2018) | energy_3 (2018) | energy_4 (2018) | energy_1 (2019) | energy_2 (2019) | energy_3 (2019) | energy_4 (2019) |
|---|---|---|---|---|---|---|---|---|---|---|
| Jan | Number of power feeding systems | Number | 100 | 100 | 100 | 100 | 102 | 102 | 102 | 102 |
| Jan | net rated power | MW | 100 | 100 | 100 | 100 | 102 | 102 | 102 | 102 |
| Jan | power feed | KwH | 100 | 100 | 100 | 100 | 102 | 102 | 102 | 102 |
| Feb | Number of power feeding systems | Number | 100 | 100 | 100 | 100 | 102 | 102 | 102 | 102 |
| Feb | net rated power | MW | 100 | 100 | 100 | 100 | 102 | 102 | 102 | 102 |
| Feb | power feed | KwH | 100 | 100 | 100 | 100 | 102 | 102 | 102 | 102 |
需要转换为包含Month、power art、unit、Energy art、Value、Year的长表格式。
解决步骤
使用pandas的melt方法将宽表转长表,再通过正则表达式拆分复合列名,具体代码如下:
import pandas as pd # 假设df为读取后的原数据DataFrame # 1. 执行melt,将所有energy列转为行 melted_df = pd.melt( df, id_vars=['Month', 'power art', 'unit'], # 保留不变的标识列 var_name='Energy_Year', # 存储原复合列名的临时列 value_name='Value' # 存储对应数值的列 ) # 2. 拆分复合列名,提取Energy art和Year # 用正则匹配"energy_x (年份)"格式的字符串 melted_df[['Energy art', 'Year']] = melted_df['Energy_Year'].str.extract(r'(energy_\d+) \((\d+)\)') # 3. 调整列顺序至目标格式,删除临时列 final_df = melted_df[['Month', 'power art', 'unit', 'Energy art', 'Value', 'Year']] # 查看转换结果 print(final_df)
代码说明
pd.melt:将宽表中所有以energy_开头的列转为行,保留Month、power art、unit作为固定标识列。- 正则拆分:通过
str.extract从复合列名中精准提取出Energy art(如energy_1)和Year(如2018)两个字段。 - 列顺序调整:重新排列列的顺序,完全匹配目标输出格式。
内容的提问来源于stack exchange,提问作者erdem
相关产品推荐
相关产品推荐

