如何在Pandas中对FRED月度数据分组求和时过滤非完整年份?
解决FRED月度数据转年度求和时排除数据不全年份的问题
你的问题核心在于当前代码只完成了年度分组求和,但没有先筛选出每个年份包含12个完整月度观测的组。2019年被错误包含,说明它的月度观测数不足12条,但原代码没做过滤就直接求和了。
下面提供两种高效的解决方案:
方法一:先过滤完整年份,再求和
这种方式逻辑直观,先把数据不全的年份全部剔除,再进行求和计算:
import pandas_datareader.data as web mnemonic = 'RSFSXMV' df = web.DataReader(mnemonic, 'fred', 2000, 2020) df['year'] = df.index.year # 筛选出每个年份有12条月度记录的行 filtered_df = df.groupby('year').filter(lambda x: len(x) == 12) # 对过滤后的完整年份进行求和 new_df = filtered_df.groupby('year')[mnemonic].sum().reset_index() print(new_df)
方法二:一次分组完成计数+求和,再过滤
这种方式只需要一次分组操作,效率更高,适合处理大规模数据:
import pandas_datareader.data as web mnemonic = 'RSFSXMV' df = web.DataReader(mnemonic, 'fred', 2000, 2020) df['year'] = df.index.year # 分组后同时计算年度总和与月度观测数 grouped_stats = df.groupby('year').agg( annual_total=(mnemonic, 'sum'), monthly_count=(mnemonic, 'count') ).reset_index() # 只保留观测数为12的完整年份,并重命名列名匹配原格式 new_df = grouped_stats[grouped_stats['monthly_count'] == 12][['year', 'annual_total']].rename(columns={'annual_total': mnemonic}) print(new_df)
关键逻辑说明:
groupby.filter()会根据lambda表达式的结果(len(x) == 12)保留所有符合条件的组的行,确保后续求和只针对数据完整的年份。- 第二种方法用
agg()一次性计算求和与计数,避免重复分组,最后通过过滤monthly_count == 12得到目标结果,性能更优。
修改后,2019年如果月度观测数不足12,就会被自动排除在最终结果里了。
内容的提问来源于stack exchange,提问作者jason
相关产品推荐
相关产品推荐

