如何按美国总统任期合并并汇总年度GDP数据集?
按总统任期汇总年度GDP的实现方案
需求说明
现有两个DataFrame:
- 年度GDP数据:
date GDP 1933 1.2 ... ... 2015 3.2
- 美国总统任期数据(已将
start/end转为datetime64类型):
start end president party 1933-03-04 1941-01-20 Franklin D. Roosevelt Democratic 1945-04-12 1953-01-20 Harry S. Truman Democratic 1953-01-20 1961-01-20 Dwight D. Eisenhower Republican ... 2017-01-20 2021-01-20 Donald Trump Republican
需要自动匹配每个总统任期对应的年度GDP并求和,无需手动计算。
实现方案
方法1:逐行应用计算(适合小数据集)
步骤1:预处理GDP数据
将GDP的date列转为datetime类型,对应年度的起始日期:
import pandas as pd # 转换GDP的date列为datetime gdp_df['date'] = pd.to_datetime(gdp_df['date'], format='%Y')
步骤2:定义求和函数并应用
通过apply遍历每个总统任期,筛选出与任期有重叠的年度GDP并求和:
def get_term_gdp(row): # 判断年度区间(date到date+1年)是否与总统任期有重叠 mask = (gdp_df['date'] <= row['end']) & (gdp_df['date'] + pd.DateOffset(years=1) > row['start']) return gdp_df.loc[mask, 'GDP'].sum() # 给总统任期DataFrame添加GDP总和列 presidents_df['GDP'] = presidents_df.apply(get_term_gdp, axis=1)
方法2:矢量化匹配(适合大数据集)
用交叉连接+筛选+分组求和的方式,效率更高:
# 交叉连接两个DataFrame cross_df = pd.merge(gdp_df.assign(key=1), presidents_df.assign(key=1), on='key').drop('key', axis=1) # 添加年度结束日期列 cross_df['year_end'] = cross_df['date'] + pd.DateOffset(years=1) # 筛选出年度与任期重叠的记录 valid_records = cross_df[(cross_df['date'] <= cross_df['end']) & (cross_df['year_end'] > cross_df['start'])] # 按任期分组求和 result_df = valid_records.groupby(['start', 'end', 'president', 'party'])['GDP'].sum().reset_index()
逻辑说明
- 核心判断逻辑:只要某年度的时间范围(1月1日至12月31日)与总统任期有任何重叠,就将该年度GDP计入总和(符合多数统计场景)。
- 若需仅统计完全被任期覆盖的年度,可将筛选条件改为:
mask = (gdp_df['date'] >= row['start']) & (gdp_df['date'] + pd.DateOffset(years=1) <= row['end'])
内容的提问来源于stack exchange,提问作者Jagernout1985
相关产品推荐
相关产品推荐

