如何计算DataFrame中各品类的日均值与月均值?
实现步骤
首先确保你已安装pandas库,然后按以下步骤操作:
1. 导入库并构造初始DataFrame
import pandas as pd # 构造你的原始数据 data = { 'date': ['29/4/2022', '30/4/2022', '30/4/2022', '1/5/2022', '1/5/2022', '1/5/2022', '1/6/2022', '1/6/2022', '1/6/2022'], 'sales': [2, 5, 1, 1, 8, 4, 7, 9, 5], 'cat': ['a', 'a', 'b', 'a', 'b', 'c', 'a', 'b', 'c'] } df = pd.DataFrame(data)
2. 转换日期格式
将date列转为datetime类型,方便后续按日、月分组计算:
df['date'] = pd.to_datetime(df['date'], dayfirst=True)
3. 计算日均值(daily_avg)
常规日均值(同分类当日sales平均)
指每个分类(cat)在同一天内的sales平均值,若某分类当日仅一条数据,均值即为该数据本身:
# 按分类和日期分组计算均值 daily_avg = df.groupby(['cat', df['date'].dt.date])['sales'].mean().reset_index(name='daily_avg') # 将结果合并回原DataFrame df = df.merge(daily_avg, left_on=['cat', df['date'].dt.date], right_on=['cat', 'date'], how='left') # 清理重复的date列 df = df.drop('date_y', axis=1).rename(columns={'date_x': 'date'})
累计日均值(截止到当前行的分类sales平均)
如果需要的是从该分类第一条数据到当前行的累计平均值,替换为以下代码:
df['daily_avg'] = df.groupby('cat')['sales'].expanding().mean().reset_index(level=0, drop=True)
4. 计算月均值(monthly_avg)
常规月均值(同分类当月sales平均)
指每个分类(cat)在同一月份内的sales平均值:
# 按分类和月份(年-月)分组计算均值 monthly_avg = df.groupby(['cat', df['date'].dt.to_period('M')])['sales'].mean().reset_index(name='monthly_avg') # 将结果合并回原DataFrame df = df.merge(monthly_avg, left_on=['cat', df['date'].dt.to_period('M')], right_on=['cat', 'date'], how='left') # 清理重复列 df = df.drop('date_y', axis=1).rename(columns={'date_x': 'date'})
累计月均值(截止到当前行的分类当月sales平均)
如果需要的是该分类当月从第一条数据到当前行的累计平均值,替换为以下代码:
df['monthly_avg'] = df.groupby(['cat', df['date'].dt.to_period('M')])['sales'].expanding().mean().reset_index(level=[0,1], drop=True)
5. 调整格式和列顺序
将日期转回dd/mm/yyyy格式,并调整列顺序匹配目标格式:
# 转换日期格式 df['date'] = df['date'].dt.strftime('%d/%m/%Y') # 调整列顺序 df = df[['date', 'sales', 'cat', 'daily_avg', 'monthly_avg']]
最终结果示例
执行完上述步骤后,若使用常规日/月均值,结果如下:
date sales cat daily_avg monthly_avg 0 29/04/2022 2 a 2.0 3.500000 1 30/04/2022 5 a 5.0 3.500000 2 30/04/2022 1 b 1.0 1.000000 3 01/05/2022 1 a 1.0 1.000000 4 01/05/2022 8 b 8.0 8.000000 5 01/05/2022 4 c 4.0 4.000000 6 01/06/2022 7 a 7.0 7.000000 7 01/06/2022 9 b 9.0 9.000000 8 01/06/2022 5 c 5.0 5.000000
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

