如何按规则填充2008美国大选民意调查数据集的缺失日期?
QSS第四章习题:2008大选民调数据处理(双层循环实现)
问题背景
需要处理2008年美国大选民调数据,要求每个州在竞选最后90天内,每日计算最近一次(或当日)民调的平均获胜率,当日多份民调取平均值。原代码仅实现了有民调日期的分组平均,无法覆盖无民调日期的最近值填充,需用双层循环(外层90天迭代,内层51个州迭代)完成。
修正后的完整代码
import pandas as pd # 读取数据集 polls08 = pd.read_csv('polls08.csv') # 定义选举日(2008年美国大选日期) election_day = pd.to_datetime('2008-11-04') # 计算每份民调距离选举日的天数 polls08['middate'] = pd.to_datetime(polls08['middate']) polls08['days_to_election'] = (election_day - polls08['middate']).dt.days # 计算奥巴马相对麦凯恩的领先率 polls08['avg_margin_of_victory'] = polls08['Obama'] - polls08['McCain'] # 筛选选举前90天内的民调(含选举当日) filtered_df = polls08[polls08['days_to_election'] <= 90].copy() # 获取所有州的唯一列表(50州+华盛顿特区) states = filtered_df['state'].unique() # 遍历选举前90天(距离选举日0到89天,共90天) days_range = range(0, 90) # 初始化结果存储列表 results = [] # 双层循环:外层遍历每日,内层遍历每个州 for days_left in days_range: for state in states: # 筛选该州中,距离选举日天数不超过当前天数的所有民调(即最新的民调范围) state_polls = filtered_df[(filtered_df['state'] == state) & (filtered_df['days_to_election'] <= days_left)] if not state_polls.empty: # 找到该州最近的民调日期(即最大的days_to_election值,对应最接近目标日期的民调) latest_poll_day = state_polls['days_to_election'].max() # 提取该日期的所有民调,计算平均领先率 latest_polls = state_polls[state_polls['days_to_election'] == latest_poll_day] avg_margin = latest_polls['avg_margin_of_victory'].mean() else: # 若该州90天内无民调,用缺失值填充 avg_margin = pd.NA # 将结果存入列表 results.append({ 'days_to_election': days_left, 'state': state, 'avg_margin_of_victory': avg_margin }) # 转换为最终DataFrame final_result = pd.DataFrame(results)
代码说明
- 修正原代码问题:补充了未定义的选举日变量,调整了民调时间范围的筛选逻辑。
- 双层循环逻辑:
- 外层循环覆盖选举前90天的每一天(
days_left为距离选举日的剩余天数)。 - 内层循环遍历每个州,针对每个州的目标日期,筛选出所有不晚于该日期的民调,找到其中最新的一批(同一日期的所有民调)并计算平均领先率。
- 外层循环覆盖选举前90天的每一天(
- 缺失值处理:若某州在90天内无任何民调,用
pd.NA标记缺失值。
内容的提问来源于stack exchange,提问作者runedus
相关产品推荐
相关产品推荐

