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

如何基于大型CSV文件按年份、月份统计销售总额?

问题描述

我有一个包含17985行的大型CSV文件,记录不同日期的销售数据,数据格式如下:

Customer   Date        Sale
Larry      1/2/2018    20$
Mike       4/3/2020    40$
John       12/5/2017   10$
Sara       3/2/2020    90$
Charles    9/8/2022    75$

已通过以下代码统计每日销售次数:

occur = df.groupby(['Date']).size()
occur

结果示例:

2018-01-02     32
2018-01-03     31
2018-01-04     42
2018-01-05    192
2018-01-06     26

但统计月度销售总额时遇到问题,比如执行:

new_df['total_sales_that_month'] = df.groupby('Date')['Sale'].sum()

结果全为NaN:

0       NaN
1       NaN
2       NaN
3       NaN
4       NaN
         ..
17980   NaN
17981   NaN
17982   NaN
17983   NaN
17984   NaN

目前已通过dt.year和dt.month提取出年月信息,需要得到包含月份/年份/月度销售总额的DataFrame,期望输出:

Month   Year    Total_sale_that_month
1       2018      420$
2       2018      521$
3       2018      124$
4       2018      412$
5       2018      745$
解决方案

1. 清理Sale列数据类型

Sale列带$符号无法直接求和,先清理转换:

import pandas as pd

# 移除$符号并转为浮点型
df['Sale'] = df['Sale'].str.replace('$', '').astype(float)

2. 确保Date列为日期类型

如果Date列尚未转为datetime格式,执行转换:

df['Date'] = pd.to_datetime(df['Date'])

3. 按年月分组计算销售总额

提供两种可行实现方式:

方式一:提取年月字段后分组

# 提取年、月字段
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month

# 按年、月分组求和
monthly_sales = df.groupby(['Year', 'Month'])['Sale'].sum().reset_index()

# 格式化销售总额并调整列结构
monthly_sales['Total_sale_that_month'] = monthly_sales['Sale'].apply(lambda x: f"{x}$")
monthly_sales = monthly_sales[['Month', 'Year', 'Total_sale_that_month']]

方式二:按月份周期直接分组

利用dt.to_period('M')直接按年月周期分组,代码更简洁:

# 按年月周期分组求和
monthly_sales = df.groupby(df['Date'].dt.to_period('M'))['Sale'].sum().reset_index()

# 拆分年、月字段
monthly_sales['Year'] = monthly_sales['Date'].dt.year
monthly_sales['Month'] = monthly_sales['Date'].dt.month

# 格式化总额并调整列顺序
monthly_sales['Total_sale_that_month'] = monthly_sales['Sale'].apply(lambda x: f"{x}$")
monthly_sales = monthly_sales[['Month', 'Year', 'Total_sale_that_month']]

4. 原代码NaN问题说明

之前的代码出现全NaN,是因为groupby('Date')后的结果索引是日期值,而new_df使用的是默认数字索引,两者无法匹配,导致赋值失败。通过reset_index()将分组结果转为普通DataFrame,即可避免该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:40:33