如何将总统数据集‘Age atstart of presidency’列清洗为指定格式?
清洗总统就职年龄列的解决方案
针对你需要将「Age at start of presidency」列统一为「X years, Y days」格式的需求,结合维基百科数据集的常见格式,给出以下Python pandas实现方案:
步骤1:分析原始数据格式
维基百科的该字段通常有3种常见形式:
- 完整格式:
57 years, 80 days - 仅年份:
43 years - 小数年份:
54.5 years(需转换为年+天)
步骤2:编写正则提取与转换代码
import pandas as pd # 读取数据集 df = pd.read_csv("presidents.csv") # 用正则提取年、天数值,覆盖所有常见格式 extract_pattern = r'(?:(\d+(?:\.\d+)?) years?,?)?(?:\s*(\d+) days?)?' df[['raw_years', 'raw_days']] = df["Age at start of presidency"].str.extract(extract_pattern) # 处理空值与数据类型转换 df['raw_years'] = df['raw_years'].fillna(0).astype(float) df['raw_days'] = df['raw_days'].fillna(0).astype(int) # 将小数年份的小数部分转为天数 decimal_days = (df['raw_years'] % 1 * 365).round().astype(int) df['final_years'] = df['raw_years'].astype(int) df['final_days'] = df['raw_days'] + decimal_days # 生成目标格式的清洗后列 df["Age at start of presidency"] = df.apply( lambda row: f"{row['final_years']} years, {row['final_days']} days", axis=1 ) # 清理中间辅助列(可选) df = df.drop(['raw_years', 'raw_days', 'final_years', 'final_days'], axis=1)
正则表达式说明
(?:(\d+(?:\.\d+)?) years?,?)?(?:\s*(\d+) days?)?
(?:(\d+(?:\.\d+)?) years?,?)?:匹配可选的年份部分,支持整数和小数年份,捕获年的数值(?:\s*(\d+) days?)?:匹配可选的天数部分,捕获天的数值
效果验证
- 输入
57 years, 80 days→ 输出57 years, 80 days - 输入
43 years→ 输出43 years, 0 days - 输入
54.5 years→ 输出54 years, 183 days
内容的提问来源于stack exchange,提问作者Yana Ghanim
相关产品推荐
相关产品推荐

