pandas中存在NaN值时按ID分组取最后日期的最佳方法
问题原因定位
你之前用data1.groupby(["ID"]).last()得不到正确结果,核心是pandas该方法的内置逻辑和你的需求不匹配:
- 该方法会自动跳过分组内的NaN值,定位每个组里最后一个非空值
- 当某个ID下所有date值都是NaN(比如案例里的ID 02),组内没有可被识别的非空值,这个ID会被直接从结果中剔除
- 此外该方法是按值取最后一个非空项,不是按原始行顺序取每组的最后一行,遇到原数据日期排序混乱的场景还会出现结果偏差
适配需求的实现方法
直接按ID分组后,取每个分组内按原数据顺序排列的最后一行即可,全程不会主动跳过包含NaN的行:
result = data1.groupby("ID", as_index=False).tail(1)
效果说明
- 完全匹配“每个ID一行、展示每个ID对应最后一条date值”的要求
- 哪怕某ID对应的最后一行date是NaN,也会正常保留该ID的记录,不会出现剔除带NaN关联ID的问题
- 严格按照原数据的行先后顺序取数,不会因为当前date是字符串格式、未转成datetime的问题打乱取数逻辑
可选后续操作
当前date列是字符串格式,拿到结果后如果需要做日期相关计算,可以直接转换格式,不会影响已保留的NaN记录:
# 匹配数据里的日/月/年格式转datetime,无法识别的值自动保留为缺失值 result["date"] = pd.to_datetime(result["date"], format="%d/%m/%Y", errors="coerce")
内容的提问来源于stack exchange,提问作者amestrian
相关产品推荐
相关产品推荐

