如何在Pandas中按日期聚合计算均值(无需循环)
按日期分组计算均值(无需循环实现)
完全不需要用foreach循环,Pandas的**分组聚合(groupby + 聚合函数)**就是专门解决这类问题的矢量化方案,效率比循环高得多。
核心解法
针对你的需求,只需要按日期列(对应你的数据里的datadate)分组,然后对value列计算均值即可。对应示例数据的代码如下:
import pandas as pd # 示例数据 sample_data = { 'date': ['2022-09-16', '2022-09-16', '2022-09-16', '2022-09-15', '2022-09-15', '2022-09-15', '2022-09-14'], 'value': [1, 2, 3, 6, 2, 2, 7] } df = pd.DataFrame(sample_data) # 按日期分组计算均值 result_df = df.groupby('date')['value'].mean().reset_index() print(result_df)
运行后输出你期望的结果:
date value 0 2022-09-14 7.000000 1 2022-09-15 3.333333 2 2022-09-16 2.000000
结合你的现有代码修改
你的代码已经完成了z-score处理,只需要在最后添加分组计算逻辑即可,同时修正set_index的赋值问题(原代码中dfyieldd.set_index('datadate')不会修改原DataFrame,因为默认不原地修改):
import pandas as pd # 你的原有代码 dfyieldd = pd.read_sql_query(getmacrofactorvalues, conn) dfyieldd.to_csv('dfyieldd_raw.csv') resultseries = pd.Series(data=dfyieldd['rawvalue']) resultzscored = zscoreoutliers(resultseries) dfyieldd['value'] = resultzscored dfyieldd.to_csv('dfyieldd_zcored.csv') # --- 新增分组计算逻辑 --- # 按datadate分组,计算value列的均值,重置索引恢复日期为普通列 result_df = dfyieldd.groupby('datadate')['value'].mean().reset_index() # 可选:将日期转为datetime类型 result_df['datadate'] = pd.to_datetime(result_df['datadate']) # 保存最终结果 result_df.to_csv('dfyieldd_daily_mean.csv', index=False)
关键说明
groupby('datadate'):将DataFrame按datadate列的值分组,相同日期的行自动归为一组['value'].mean():对每个分组的value列计算均值,自动完成「求和÷记录数」的逻辑reset_index():将分组用的datadate从索引变回普通列,得到结构规整的结果DataFrame
这种方式是Pandas原生的矢量化操作,底层用C实现,比Python循环快几个数量级,尤其适合大数据量场景。
内容的提问来源于stack exchange,提问作者ldamato
相关产品推荐
相关产品推荐

