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

如何对字符串列执行Max聚合?解决NaN问题及自定义比较函数咨询

解决Groupby赋值全NaN问题及自定义比较函数实现

首先,你遇到全NaN的问题不是因为非数值型Series不能执行max操作——实际上,像YYYY-MM-DD格式的日期字符串是可以通过字典序比较出大小的,pandas的max方法完全能处理它。真正的原因是:你直接将groupby.max()的结果赋值给原DataFrame的新列时,索引没有对齐。

dataframe.groupby(["DEPARTMENT_ID"])["SLOT_BEGIN_TIME"].max()返回的结果是一个以DEPARTMENT_ID(A、B)为索引的Series,而原DataFrame的索引是默认的0、1、2、3。当你直接赋值时,pandas会尝试按索引匹配,原DataFrame的索引0-3在groupby结果的索引里找不到对应项,所以全部变成NaN。


最优解决方案:用transform替代直接赋值

不需要自定义函数,用transform方法就能轻松解决,它会将每个组的最大值广播到该组的所有行,自动和原DataFrame索引对齐:

import pandas as pd

# 你的原始DataFrame
dataframe = pd.DataFrame.from_dict( { 
    "DEPARTMENT_ID": ["A", "B", "A", "B"], 
    "SLOT_BEGIN_TIME": ["2014-01-01", "2014-01-02", "2014-02-01", "2014-02-02"], 
} )

# 直接用transform获取每组最大值并赋值
dataframe["MAX_TIME"] = dataframe.groupby(["DEPARTMENT_ID"])["SLOT_BEGIN_TIME"].transform('max')

执行后你会得到正确的结果:

DEPARTMENT_IDSLOT_BEGIN_TIMEMAX_TIME
A2014-01-012014-02-01
B2014-01-022014-02-02
A2014-02-012014-02-01
B2014-02-022014-02-02

如果想更严谨(比如避免非标准日期字符串的比较错误),建议先将SLOT_BEGIN_TIME转为datetime类型,再执行操作:

# 转datetime类型
dataframe['SLOT_BEGIN_TIME'] = pd.to_datetime(dataframe['SLOT_BEGIN_TIME'])
# 获取每组最大日期(自动保持datetime类型)
dataframe['MAX_TIME'] = dataframe.groupby('DEPARTMENT_ID')['SLOT_BEGIN_TIME'].transform('max')
# 若需要转回字符串格式:
# dataframe['MAX_TIME'] = dataframe['MAX_TIME'].dt.strftime('%Y-%m-%d')

用自定义比较函数实现需求

如果你确实需要用自定义函数来实现最大值比较(比如有特殊的日期格式或比较规则),可以结合transform和自定义函数:

示例1:自定义字符串比较(针对YYYY-MM-DD格式)

def custom_str_max(series):
    # 直接利用字符串字典序比较日期(仅适用于YYYY-MM-DD格式)
    return max(series)

dataframe["MAX_TIME"] = dataframe.groupby('DEPARTMENT_ID')['SLOT_BEGIN_TIME'].transform(custom_str_max)

示例2:自定义datetime比较(更通用)

def custom_datetime_max(series):
    # 先转为datetime类型,再取最大值,最后转回字符串(按需调整)
    dt_series = pd.to_datetime(series)
    return dt_series.max().strftime('%Y-%m-%d')

dataframe["MAX_TIME"] = dataframe.groupby('DEPARTMENT_ID')['SLOT_BEGIN_TIME'].transform(custom_datetime_max)

这样就能通过自定义函数实现每组最大值的计算,同时保证结果和原DataFrame正确对齐。

内容的提问来源于stack exchange,提问作者D. Seah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:12:46