按分组基于年份列扩展数据,填补年份间隔缺失行
填补人员年份间隔数据的解决方案
现有如下格式的人员数据,其中部分记录的年份跨度(year_2 - year_1)大于1年,需要按人员分组,填补中间缺失的年度行,让每一行的年份跨度均为1年:
原始数据
name year_1 year_2 location job Joe 1990 1991 Boston Engineer Joe 1991 1992 Boston Engineer Joe 1992 1996 New York Data Scientist Joe 1996 1998 Chicago Data Scientist Peter 2003 2004 Montreal HR Peter 2004 2006 Singapore Marketing
目标结果
name year_1 year_2 location job Joe 1990 1991 Boston Engineer Joe 1991 1992 Boston Engineer Joe 1992 1993 New York Data Scientist Joe 1993 1994 New York Data Scientist Joe 1994 1995 New York Data Scientist Joe 1995 1996 New York Data Scientist Joe 1996 1997 Chicago Data Scientist Joe 1997 1998 Chicago Data Scientist Peter 2003 2004 Montreal HR Peter 2004 2005 Singapore Marketing Peter 2005 2006 Singapore Marketing
实现代码(Python + Pandas)
import pandas as pd # 加载原始数据(实际场景可替换为pd.read_csv读取文件) raw_data = pd.DataFrame({ 'name': ['Joe', 'Joe', 'Joe', 'Joe', 'Peter', 'Peter'], 'year_1': [1990, 1991, 1992, 1996, 2003, 2004], 'year_2': [1991, 1992, 1996, 1998, 2004, 2006], 'location': ['Boston', 'Boston', 'New York', 'Chicago', 'Montreal', 'Singapore'], 'job': ['Engineer', 'Engineer', 'Data Scientist', 'Data Scientist', 'HR', 'Marketing'] }) def fill_year_gaps(group): expanded = [] for _, row in group.iterrows(): start_year = row['year_1'] end_year = row['year_2'] # 当年份跨度大于1时,生成中间行 if end_year - start_year > 1: for y in range(start_year, end_year): expanded.append({ 'name': row['name'], 'year_1': y, 'year_2': y + 1, 'location': row['location'], 'job': row['job'] }) else: expanded.append(row.to_dict()) return pd.DataFrame(expanded) # 按人员分组处理,合并结果 result_data = raw_data.groupby('name').apply(fill_year_gaps).reset_index(drop=True) # 打印格式化结果 print(result_data.to_string(index=False))
代码说明
- 先加载原始数据,实际使用时可通过
pd.read_csv直接读取本地或远程数据文件 - 定义
fill_year_gaps函数,遍历每组内的每一行:- 若当前行的年份跨度大于1年,循环生成每个年度的过渡行,保持
name、location、job字段不变 - 若跨度为1年,直接保留原行
- 若当前行的年份跨度大于1年,循环生成每个年度的过渡行,保持
- 按
name分组应用函数,重置索引后得到最终的完整数据 - 打印输出的格式与目标结果完全匹配
内容的提问来源于stack exchange,提问作者RandomThinker
相关产品推荐
相关产品推荐

