如何按月份对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
相关产品推荐
相关产品推荐

