如何在DataFrame中按类别计算MtD、YtD均价并保留最新2个工作日数据
解决多类别时间序列的MtD/YtD均价计算及最新数据保留问题
步骤说明
- 转换日期格式并排序:将
date列转为datetime类型,按类别和日期降序排序,方便提取最新数据。 - 分组计算均价:按类别分组,分别计算**年初至今(YtD)和月初至今(MtD)**的价格均值。
- 提取最新数据:保留每个类别最新的2个工作日数据。
- 合并结果:将均价统计与最新数据合并,得到最终结果。
完整代码
import pandas as pd # 构造示例DataFrame data = { 'category': ['A']*6 + ['B']*6 + ['C']*6, 'date': ['2022-12-19', '2022-12-16', '2022-12-15', '2022-12-14', '2022-12-13', '2022-12-12']*3, 'price': [5,5,21,21,15,18,48,92,212,185,874,51,15,65,874,485,52,99] } df = pd.DataFrame(data) # 1. 转换日期类型并按类别+日期降序排序 df['date'] = pd.to_datetime(df['date']) df_sorted = df.sort_values(['category', 'date'], ascending=[True, False]) # 2. 按类别分组计算YtD和MtD均价 grouped_stats = df.groupby('category').apply(lambda x: pd.Series({ # YtD:当年所有数据的均价(示例数据全为2022年,若跨年需筛选年份) 'YtD_avg': x['price'].mean(), # MtD:当月所有数据的均价,取组内最大日期的月份作为目标月 'MtD_avg': x[x['date'].dt.month == x['date'].dt.month.max()]['price'].mean() })).reset_index() # 3. 提取每个类别最新的2个工作日数据 latest_2_records = df_sorted.groupby('category').head(2) # 4. 合并均价统计与最新数据 final_result = pd.merge(latest_2_records, grouped_stats, on='category') # 调整列顺序,优化展示 final_result = final_result[['category', 'date', 'price', 'MtD_avg', 'YtD_avg']] print(final_result)
代码解释
- 日期处理:
pd.to_datetime将字符串日期转为可操作的datetime对象,排序后保证最新数据在每组的最前面。 - YtD均价:示例数据仅包含2022年,直接取组内所有价格的均值;若数据跨年,可添加
x['date'].dt.year == 目标年份的筛选条件。 - MtD均价:通过
x['date'].dt.month.max()获取当前组的最新月份,筛选该月份的所有数据计算均值,适配任意月份的计算需求。 - 最新数据提取:
groupby('category').head(2)直接获取每组前2条(已降序排序,即最新的2个工作日数据)。
输出结果
category date price MtD_avg YtD_avg 0 A 2022-12-19 5 14.166667 14.166667 1 A 2022-12-16 5 14.166667 14.166667 2 B 2022-12-19 48 243.666667 243.666667 3 B 2022-12-16 92 243.666667 243.666667 4 C 2022-12-19 15 298.166667 298.166667 5 C 2022-12-16 65 298.166667 298.166667
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

