如何基于列名将含州标识的宽格式DataFrame转换为长格式?
Pandas宽表转长表(带前缀列名)解决方案
代码实现
首先构造示例数据(若你已有现成DataFrame,可跳过此步):
import pandas as pd import numpy as np df = pd.DataFrame({ 'id': [1, 2, 3], 'university': ['abc', 'def', 'ijk'], '# CA Holiday': [1, 5, 1], '# CA Hours': [5, np.nan, 5], '# WA Holiday': [np.nan, 3, np.nan], '# WA Hours': [3, 7, 3] })
执行数据转换:
# 1. 将宽表转为长表,保留id和university作为标识列 melted_df = df.melt(id_vars=['id', 'university'], var_name='combined_col', value_name='value') # 2. 拆分合并列名,提取州名和指标类型 melted_df[['Holiday_State', 'Metric']] = melted_df['combined_col'].str.lstrip('# ').str.split(' ', expand=True) # 3. 将指标列转回宽表,得到目标格式 final_df = melted_df.pivot_table( index=['id', 'university', 'Holiday_State'], columns='Metric', values='value', aggfunc='first' ).reset_index() # 移除列名层级标签 final_df.columns.name = None
转换结果
运行后得到的final_df格式如下:
id university Holiday_State Holiday Hours 0 1 abc CA 1.0 5.0 1 1 abc WA NaN 3.0 2 2 def CA 5.0 NaN 3 2 def WA 3.0 7.0 4 3 ijk CA 1.0 5.0 5 3 ijk WA NaN 3.0
说明
这个方法灵活适配带前缀的列名格式,若后续列名前缀有变化,只需调整str.lstrip()的参数即可兼容。
内容的提问来源于stack exchange,提问作者floss
相关产品推荐
相关产品推荐

