如何在Pandas中重塑DataFrame:将宽格式转为长格式结构
Pandas DataFrame 宽表转长表并提取角度信息
原DataFrame结构:
import pandas as pd # 构建示例数据 data = { 'Candidate': ['10006A', '10008A'], 'z0, 0deg': [0.30, 0.30], 'z0, 30deg': [0.05, 0.30], 'z0, 60deg': [0.05, 0.30], 'z0, 90deg': [0.05, 0.30], 'z0, 120deg': [0.05, 0.30], 'z0, 150deg': [0.30, 0.30], 'z0, 180deg': [0.05, 0.30], 'z0, 210deg': [0.05, 0.05], 'z0, 240deg': [0.05, 0.05] } df = pd.DataFrame(data)
输出的原表:
Candidate z0, 0deg z0, 30deg z0, 60deg z0, 90deg z0, 120deg z0, 150deg z0, 180deg z0, 210deg z0, 240deg 0 10006A 0.30 0.05 0.05 0.05 0.05 0.30 0.05 0.05 0.05 1 10008A 0.30 0.30 0.30 0.30 0.30 0.30 0.30 0.05 0.05
目标结构:
Candidate angle z0 0 10006A 0 0.30 1 10006A 30 0.05 2 10006A 60 0.05 3 10006A 90 0.05 4 10006A 120 0.05 5 10006A 150 0.30 6 10006A 180 0.05 7 10006A 210 0.05 8 10006A 240 0.05 9 10008A 0 0.30 ...
实现步骤:
- 使用
pd.melt()将宽表转为长表,保留Candidate作为标识列 - 从原列名字符串中提取角度数值,转换为整数类型
- 移除临时列,调整列顺序,最后按
Candidate和angle排序
完整代码:
# 1. 宽表转长表 melted_df = df.melt(id_vars='Candidate', var_name='angle_col', value_name='z0') # 2. 提取角度数值:从"z0, Xdeg"中提取X,转为整数 melted_df['angle'] = melted_df['angle_col'].str.extract(r'(\d+)').astype(int) # 3. 移除临时列,调整列顺序,按要求排序 result_df = melted_df.drop('angle_col', axis=1)[['Candidate', 'angle', 'z0']] result_df = result_df.sort_values(by=['Candidate', 'angle']).reset_index(drop=True) print(result_df)
输出结果:
Candidate angle z0 0 10006A 0 0.30 1 10006A 30 0.05 2 10006A 60 0.05 3 10006A 90 0.05 4 10006A 120 0.05 5 10006A 150 0.30 6 10006A 180 0.05 7 10006A 210 0.05 8 10006A 240 0.05 9 10008A 0 0.30 10 10008A 30 0.30 11 10008A 60 0.30 12 10008A 90 0.30 13 10008A 120 0.30 14 10008A 150 0.30 15 10008A 180 0.30 16 10008A 210 0.05 17 10008A 240 0.05
内容的提问来源于stack exchange,提问作者TomGeo
相关产品推荐
相关产品推荐

