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

如何按月份对DataFrame的所有列求和并生成指定格式结果?

解决方法

你的代码存在两个核心问题:

  • 原date列并非datetime类型,无法直接调用dt.to_period方法
  • 你的分组逻辑是对C、P列分别求和,但需求是把每个月里C和P的所有数值加总(比如4月是0.06+0.94+0.15+1.32),并非分开计算C的总和与P的总和

以下是完整实现步骤:

步骤1:导入库并构造数据集

import pandas as pd

data = {
    'date': ['15.4.21', '16.4.21', '2.5.21', '8.5.21', '9.6.21', '1.2.22'],
    'C': [0.06, 0.15, 0.06, 0.20, 0.04, 0.05],
    'P': [0.94, 1.32, 1.17, 0.82, -5.09, 7.09]
}
df = pd.DataFrame(data)

步骤2:日期转换与数据处理

# 1. 将date列转为datetime类型,指定原格式为「日.月.年」
df['date'] = pd.to_datetime(df['date'], format='%d.%m.%y')

# 2. 把C、P列转成长格式,让所有数值处于同一列,方便统一求和
long_df = df.melt(id_vars='date', value_vars=['C', 'P'], var_name='type', value_name='value')

# 3. 按「月份+年份」分组,计算该月所有数值的总和
monthly_sum = long_df.groupby(long_df['date'].dt.to_period('M'))['value'].sum()

# 4. 转换为宽格式,并将列名设置为「英文月份名+年份」格式
result = monthly_sum.to_frame().T
result.columns = [f'{col.strftime("%B %y")}' for col in monthly_sum.index]

最终输出结果

运行后得到的result即为所需格式:

April 21  May 21  June 21  February 22
0      2.47    2.25    -5.05        7.14

补充说明

  • 若需要缩写月份名(如Apr 21),可将%B替换为%b
  • melt函数的作用是把宽表转为长表,确保C和P的所有数值能被统一求和

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:40:30