如何通过切片列值转换美国执政党DataFrame的年份格式
解决方案:将美国执政党任期数据转换为年度数据
问题分析
你需要把Years In Office列(格式如yyyy-yyyy)的任期数据,拆分成1945-2022年每行对应单个年份与执政党的结构。原代码存在几个核心问题:
- 嵌套循环效率低下,且
loc索引方向错误(应为loc[j, 'Party']而非反向) - 未包含任期的结束年份(比如
1981-1989需覆盖1989年) - 固定字符串切片易因格式异常出错,分割逻辑不够健壮
修正后的代码
import pandas as pd import numpy as np # 读取并预处理原始数据 us_gov = pd.read_csv('/Users/elgasko/Documents/NUMERO ARMAS NUCLEARES/presidents.csv') # 截取1945年后的行,保留目标列 us_gov = us_gov.iloc[31:, 1:4][['Years In Office', 'Party']] # 按任期排序并保存结果(原代码未赋值,排序未生效) us_gov = us_gov.sort_values(by=['Years In Office']) # 创建目标DataFrame,包含1945-2022年的年份列 us_gov_def = pd.DataFrame({'Year': range(1945, 2023)}) us_gov_def['Party'] = np.nan # 遍历任期数据,批量填充对应年份的政党 for _, row in us_gov.iterrows(): # 分割任期字符串,提取起止年份 start_str, end_str = row['Years In Office'].split('-') start_year = int(start_str) end_year = int(end_str.strip()) # 确保结束年份不超过2022 end_year = min(end_year, 2022) # 用布尔索引定位年份范围,批量填充政党 year_mask = (us_gov_def['Year'] >= start_year) & (us_gov_def['Year'] <= end_year) us_gov_def.loc[year_mask, 'Party'] = row['Party'].strip().lower() # 可选:将年份设为索引 us_gov_def.set_index('Year', inplace=True) print(us_gov_def.head())
关键改进点
- 用
iterrows()遍历行,代码更简洁易读 - 用
split('-')分割任期字符串,避免固定切片的格式风险 - 采用布尔索引批量填充数据,比嵌套循环效率提升显著
- 处理结束年份边界(限制在2022年),避免超出目标范围
- 修复排序未生效的问题,确保任期按时间顺序处理
内容的提问来源于stack exchange,提问作者Mario Diez Martínez
相关产品推荐
相关产品推荐

