You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中按月份将DataFrame的Cost与total_CN列并排

解决方法

情况1:已生成df_final,调整列结构

假设你的df_final列名格式为{月份}_{指标}(比如2023-01_Cost、2023-01_total_CN),可以通过拆分列名、重新排序或重塑结构来实现需求:

方式A:转成长表(每个月份一行,Cost和total_CN为列)

import pandas as pd

# 拆分列名为月份和指标两部分
df_final.columns = df_final.columns.str.extract('(.*)_(Cost|total_CN)', expand=True)

# 重置索引(假设原索引是ID这类标识列,若不是则替换为实际的主键列)
df_long = df_final.reset_index().melt(
    id_vars='index', 
    var_name=['Month', 'Metric'], 
    value_name='Value'
)

# 将指标转成列,得到最终结构
df_result = df_long.pivot_table(
    index=['index', 'Month'], 
    columns='Metric', 
    values='Value'
).reset_index()
df_result.columns.name = None  # 移除列名的层级标签

方式B:保持宽表,同一月份的Cost和total_CN并列

# 拆分列名为MultiIndex(月份+指标)
df_final.columns = pd.MultiIndex.from_tuples(
    df_final.columns.str.extract('(.*)_(Cost|total_CN)', expand=True)
)

# 按月份排序列,确保同一月份的两个指标列相邻
df_final = df_final.sort_index(axis=1, level=0)

# 可选:将MultiIndex列转回普通字符串列名
df_final.columns = ['_'.join(col) for col in df_final.columns]

情况2:从源头修改代码,直接生成目标结构

如果你是分别生成Cost和total_CN的透视表再concat,不如合并处理,一步到位:

假设原始数据包含ID、Month、Cost、total_CN列,直接这样做:

# 先将Cost和total_CN转成长格式
df_melt = df.melt(
    id_vars=['ID', 'Month'], 
    value_vars=['Cost', 'total_CN'], 
    var_name='Metric', 
    value_name='Value'
)

# 透视生成目标结构,index为ID,columns为(Month, Metric)
df_final = pd.pivot_table(
    df_melt, 
    values='Value', 
    index='ID', 
    columns=['Month', 'Metric']
)

# 可选:转成普通列名并按月份排序
df_final.columns = ['_'.join(col) for col in df_final.columns]
df_final = df_final.reindex(sorted(df_final.columns, key=lambda x: x.split('_')[0]), axis=1)

这样生成的df_final天然就是同一月份下Cost与total_CN并列的结构,无需后续调整。

内容的提问来源于stack exchange,提问作者Sandeep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:36:14