Pandas按多列groupby分组后提取非分组列最后非空值问题咨询
解决方法
问题原因
- 原代码使用的
last聚合规则是直接取分组最后一行对应列的值,不会跳过空值,空值会被正常返回 - 分组键设置错误:将DOB、BirthPlace两个可能为空的字段加入分组键,同一个人的多条记录会被拆分到不同分组,无法合并
- 注意列名大小写要和表中实际列名一致,原代码中
Fname、Desig属于拼写错误,会直接报错或返回空值
实现步骤
1. 预处理空值
首先把表中的空字符串、全空格内容统一识别为pandas空值:
import pandas as pd import numpy as np # 替换所有空/全空格字符串为NaN input_df = input_df.replace(r'^\s*$', np.nan, regex=True)
2. 分组聚合取最后一个非空值
只使用唯一标识用户的FName、LastName作为分组键,两种实现方式可选:
方式1:兼容所有pandas版本,自定义聚合函数
# 自定义函数:返回序列最后一个非空值 def get_last_non_null(series): valid_values = series.dropna() return valid_values.iloc[-1] if len(valid_values) > 0 else np.nan # 分组聚合 result_df = input_df.groupby(['FName', 'LastName'], dropna=False).agg( DOB = ('DOB', get_last_non_null), BirthPlace = ('BirthPlace', get_last_non_null), Address = ('Address', get_last_non_null), Design = ('Design', get_last_non_null) ).reset_index()
方式2:pandas 1.3.0+版本简化写法
高版本pandas的groupby.last()方法默认会跳过空值取最后一个有效值,直接调用即可:
result_df = input_df.groupby(['FName', 'LastName'], dropna=False).last().reset_index()
运行后得到的结果和你预期的输出完全一致。
内容的提问来源于stack exchange,提问作者Tabber
相关产品推荐
相关产品推荐

