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

Python Pandas分组查询:获取每位用户最后日期的Sale数据

如何获取DataFrame中每位人员最后日期对应的Sale数据?

你遇到的问题很常见——用groupby只拿到了最大日期,但没法直接关联对应的Sale值对吧?先理清楚你的场景:

你有这样的销售数据DataFrame:

Name Date       Sale
John 2018-3-23  10000
John 2018-3-24  12000
John 2018-3-28  11000
Mary 2018-3-25  15000
Mary 2018-3-29  12000
Mary 2018-3-31  13000
Sam  2018-3-25  18000
Sam  2018-3-26  12000
Sam  2018-3-27  14000

想要提取每位人员最后日期对应的Sale数据,目标结果是:

Name Date       Sale
John 2018-3-28  11000
Mary 2018-3-31  13000
Sam  2018-3-27  14000

之前的df.groupby('Name')['Date'].apply(lambda x: x.max())只能拿到Name和Date,因为你只对Date列做了聚合。下面给你两种实用的解决方法:

方法一:用idxmax定位行索引后筛选

这个方法的核心是找到每个分组中最大日期对应的行索引,再用索引提取整行数据:

# 第一步:确保Date列是datetime类型(字符串日期比较容易出问题)
import pandas as pd
df['Date'] = pd.to_datetime(df['Date'])

# 获取每个Name组内最大Date对应的行索引
max_date_indices = df.groupby('Name')['Date'].idxmax()

# 根据索引提取原DataFrame的对应行,重置索引让结果更整洁
result = df.loc[max_date_indices].reset_index(drop=True)

idxmax()会返回每个分组中最大值所在的行的位置,用loc就能拿到包含Sale的完整行数据。

方法二:排序后去重,简单直观

另一种思路是先按人员分组,再对每组的日期降序排序,最后保留每个人员的第一行(也就是日期最晚的那行):

# 同样先转换Date为datetime类型
df['Date'] = pd.to_datetime(df['Date'])

# 按Name升序、Date降序排序 → 保留每个Name的第一行 → 重置索引
result = df.sort_values(by=['Name', 'Date'], ascending=[True, False]) \
           .drop_duplicates(subset='Name', keep='first') \
           .reset_index(drop=True)

这种方法逻辑清晰,不需要复杂的分组聚合,新手也容易理解。

重要提醒

一定要先把Date列转换成datetime类型!如果直接用字符串比较日期,会出现类似"2018-12-1"比"2018-3-31"小的错误(因为字符串是按字符顺序比较的),转换后才能正确比较日期的先后。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:40:13