You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:09:02