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
相关产品推荐
相关产品推荐

