Pandas如何组合DataFrame行索引与列名转换为指定长表结构
DataFrame宽表转指定长表结构实现方案
你需要的是把行索引为年份、列名为季度的宽格式EPS表,转换为「年份+季度」为单一维度的长表,不需要调用MultiIndex或者itertools相关逻辑,用pandas原生的重塑方法即可实现。
初始数据确认
初始df结构如下:
print(df) Q1 Q2 Q3 Q4 2008 18.19 19.78 17.49 5.62 2009 12.83 16.03 16.36 16.80 2010 19.71 21.48 21.75 22.55
方法1:用stack实现(推荐,顺序自动对齐)
stack()会自动把列索引(季度)下沉为二级行索引,天然按「年份→季度」的顺序排列,不需要额外排序:
# 列转行得到多层索引的序列 s = df.stack() # 重置索引后重命名列 df1 = s.reset_index() df1.columns = ['年份', '季度', 'EPS'] # 拼接Year字段,筛选目标列 df1['Year'] = df1['年份'].astype(str) + df1['季度'] df1 = df1[['Year', 'EPS']].reset_index(drop=True)
方法2:用melt实现
melt是pandas专门用于宽转长的API,注意最后需要按Year字段排序来匹配目标顺序:
df1 = df.melt(ignore_index=False, var_name='季度', value_name='EPS')\ .reset_index(names='年份') df1['Year'] = df1['年份'].astype(str) + df1['季度'] df1 = df1[['Year', 'EPS']].sort_values('Year').reset_index(drop=True)
两种方法运行后打印df1,输出结果和目标结构完全一致:
print(df1) Year EPS 0 2008Q1 18.19 1 2008Q2 19.78 2 2008Q3 17.49 3 2008Q4 5.62 4 2009Q1 12.83 5 2009Q2 16.03 6 2009Q3 16.36 7 2009Q4 16.80 8 2010Q1 19.71 9 2010Q2 21.48 10 2010Q3 21.75 11 2010Q4 22.55
内容的提问来源于stack exchange,提问作者Gerry
相关产品推荐
相关产品推荐

