如何用Python函数简化基于年份的pandas数据过滤与聚合流程?
简化年份过滤与聚合的重复流程
直接写个自定义函数把这套重复逻辑封装起来,以后传年份就能直接用:
def process_year_sales(df, year): # 过滤指定年份的month和sales列 filtered_df = df[df['year'] == year][['month', 'sales']] # 按月份分组求平均,重命名列 result_df = filtered_df.groupby('month').agg({'sales': 'mean'}).reset_index() result_df.rename(columns={'sales': f's{str(year)[2:]}'}, inplace=True) return result_df
调用的时候就简单多了,循环年份批量生成结果:
years = [2013, 2014, 2015, 2016, 2017] # 把结果存在字典里,方便后续调用 year_dfs = {} for y in years: year_dfs[f'df_{y}'] = process_year_sales(df_train1, y) # 比如取2013年的结果就是 year_dfs['df_2013']
如果不想生成多个单独的DataFrame,更高效的做法是一次性处理所有年份,直接得到合并后的结果,不用后续再拼接:
# 按年份和月份分组求平均 agg_df = df_train1.groupby(['year', 'month'])['sales'].mean().reset_index() # 把年份转成列名,得到类似你原来多个df合并后的格式 final_df = agg_df.pivot(index='month', columns='year', values='sales').reset_index() # 重命名列,和之前的s13、s14格式统一 final_df.columns = ['month'] + [f's{str(y)[2:]}' for y in years]
这样一行就搞定所有年份的处理,比生成多个df再合并要高效得多。
内容的提问来源于stack exchange,提问作者Tan
相关产品推荐
相关产品推荐

