如何根据起止日期提取年份范围生成新行以对齐DataFrame结构
领导人数据集结构对齐实现方案
核心思路
通过生成任期覆盖的所有年份列表,再对列表做行展开,即可将按「领导人任期」聚合的数据集转换为和第一个数据集一致的「国家-年度」粒度结构,全程保留原有的国家、领导人、任期时间等基础信息。
分步代码实现
1. 日期格式预处理
首先将第二个DataFrame的任期起止列转换为pandas可识别的datetime格式,方便提取年份:
import pandas as pd # df2对应你提供的第二个按任期存储的DataFrame df2['leader_start_date'] = pd.to_datetime(df2['leader_start_date']) df2['leader_end_date'] = pd.to_datetime(df2['leader_end_date'])
2. 生成年度列表并展开
为每一行任期生成其覆盖的所有年份,再将年份列表展开为单独行:
# 为每条任期生成覆盖的所有年份列表 df2['year'] = df2.apply( lambda row: list(range(row['leader_start_date'].year, row['leader_end_date'].year + 1)), axis=1 ) # 展开年份列,每一年对应独立行,其他信息同步复用 df2_exploded = df2.explode('year', ignore_index=True)
3. 列名对齐第一个数据集
调整列名和列顺序,和第一个「国家-年度」粒度的DataFrame结构完全对齐:
df2_aligned = df2_exploded.rename(columns={ 'LeaderCountryISO': 'country_isocode', 'LeaderCountryOrIGO': 'country_name', 'LeaderFullName': 'leader' })[['year', 'country_isocode', 'country_name', 'leader', 'leader_start_date', 'leader_end_date']]
处理完成的df2_aligned就和第一个DataFrame结构完全一致,可以直接用于后续比对。
后续拼写差异比对参考
完成结构对齐后,可通过关联查询快速定位姓名拼写不一致的条目:
# df1对应你提供的第一个「国家-年度」粒度的DataFrame compare_result = pd.merge( df1, df2_aligned, on=['year', 'country_isocode', 'leader_start_date', 'leader_end_date'], how='outer', suffixes=('_source1', '_source2') ) # 筛选出两个来源姓名拼写不匹配的记录 diff_records = compare_result[compare_result['leader_source1'] != compare_result['leader_source2']]
内容的提问来源于stack exchange,提问作者LennyAngola
相关产品推荐
相关产品推荐

