如何基于大型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
相关产品推荐
相关产品推荐

