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

如何在Pandas中按Serial分组并筛选最大日期对应的行?

解决按分组保留最大日期行的问题

你的问题出在直接将df赋值为分组聚合后的结果,导致丢失了Else等其他列。以下是两种可行的解决方案:

方法一:使用transform广播分组结果

transform可以将分组计算的最大日期广播到原DataFrame的每一行,直接进行行筛选:

import pandas as pd

# 初始化原DataFrame
df = pd.DataFrame({'Serial' : ['A1', 'A1', 'A1', 'B1','B1', 'B1'],
                   'Day' : ['01.01.2022', '01.01.2022', '01.01.2021', '01.01.2019', '01.01.2019', '01.01.2020'],
                   'Else' : ['a', 'b', 'c', 'd','e', 'f']})

# 转换Day列为datetime类型
df['Day'] = pd.to_datetime(df['Day'], format="%d.%m.%Y")

# 计算每组的最大日期,并广播到原表每行
max_day_per_group = df.groupby('Serial')['Day'].transform('max')

# 筛选出Day等于对应组最大日期的行
result = df[df['Day'] == max_day_per_group]

# 可选:将Day列转回原字符串格式
result['Day'] = result['Day'].dt.strftime('%d.%m.%Y')
print(result)

方法二:使用merge匹配分组最大日期

先单独计算每组的最大日期,再通过合并操作筛选匹配行:

import pandas as pd

df = pd.DataFrame({'Serial' : ['A1', 'A1', 'A1', 'B1','B1', 'B1'],
                   'Day' : ['01.01.2022', '01.01.2022', '01.01.2021', '01.01.2019', '01.01.2019', '01.01.2020'],
                   'Else' : ['a', 'b', 'c', 'd','e', 'f']})

df['Day'] = pd.to_datetime(df['Day'], format="%d.%m.%Y")

# 计算每组最大日期,重置索引保留Serial列
max_days = df.groupby('Serial')['Day'].max().reset_index()

# 合并原表与最大日期表,筛选匹配行
result = pd.merge(df, max_days, on=['Serial', 'Day'])

# 转回日期字符串格式
result['Day'] = result['Day'].dt.strftime('%d.%m.%Y')
print(result)

两种方法都能得到你想要的结果,其中transform方法更简洁高效,适合处理较大数据集。

内容的提问来源于stack exchange,提问作者Ta a Le

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:20:38