使用Pandas按条件删除重复学生ID行并填充缺省字段值的实现方法
Pandas实现步骤
- 核心逻辑是按
student_id分组后,每个分组内取各列的非空值合并,刚好匹配你的数据规则:同一学生的不同字段有效值分散在两行,合并后就是完整的单条记录。
完整可运行代码
import pandas as pd # --------------- 数据准备阶段 --------------- # 你的实际使用可以替换为读取数据源的代码,例如pd.read_excel、pd.read_csv等 df = pd.DataFrame({ 'student_id': [1001, 1001, 1002, 1003, 1003], 'completed': ['N', 'Y', 'N', 'N', 'Y'], 'start_enroll': ['2013-09-03', pd.NA, '2014-09-02', '2008-08-25', pd.NA], 'end_enroll': ['2017-02-27', pd.NA, '2020-05-30', '2012-08-10', pd.NA], 'completed_date': [pd.NA, '2018-02-26', pd.NA, pd.NA, '2012-08-10'] }) # 可选:日期类字段统一转为datetime类型,方便后续计算 df[['start_enroll', 'end_enroll', 'completed_date']] = df[['start_enroll', 'end_enroll', 'completed_date']].apply(pd.to_datetime) # --------------- 核心处理逻辑 --------------- # 按student_id分组,每组内各列取第一个非空值,直接得到合并结果 result_df = df.groupby('student_id', as_index=False).agg(lambda col: col.dropna().iloc[0])
结果验证
运行后输出result_df即可得到你期望的结构,逻辑完全符合要求:
- 有两条记录的学生自动合并:保留
completed=Y,同时补全start_enroll、end_enroll字段 - 只有一条记录的学生保留原数据不变
内容的提问来源于stack exchange,提问作者floss
相关产品推荐
相关产品推荐

