本文介绍如何使用 pandas 对 dataframe 按某一列(如产品类别)分组,并保留每组中日期列最新(最大)的那一条记录,适用于去重+时效性筛选场景。
本文介绍如何使用 pandas 对 dataframe 按某一列(如产品类别)分组,并保留每组中日期列最新(最大)的那一条记录,适用于去重+时效性筛选场景。
在数据分析中,常遇到这样的需求:原始数据存在按某字段(如 B 列代表品类)的重复项,而我们希望对每个品类只保留其对应最新日期(即 A 列中最大值)所在的一行——这并非简单去重,而是基于时间优先级的“智能保留”。
需要注意的是:示例中的日期为字符串格式(如 '26/12/2023'),直接使用 .max() 会触发字典序比较(例如 '26/12/2022' > '01/01/2024' 可能返回错误结果)。因此,必须先将日期列转换为 datetime 类型,再执行分组聚合。
以下是完整、健壮的实现步骤:
✅ 步骤 1:确保日期列为 datetime 类型
import pandas as pd
# 示例数据(注意:原始日期为 DD/MM/YYYY 格式)
df = pd.DataFrame({
'A': ['26/12/2023', '26/12/2022', '26/12/2023', '26/12/2022',
'26/12/2023', '26/12/2022', '26/12/2023'],
'B': ['apple', 'apple', 'pear', 'orange', 'wildberry', 'wildberry', 'grapes'],
'E': ['7,9', '8,3', '28,6', '33,3', '24,7', '29,1', '17,1']
})
# 关键:转为 datetime,指定 format 避免解析歧义
df['A'] = pd.to_datetime(df['A'], format='%d/%m/%Y')✅ 步骤 2:按 B 分组,获取每组 A 最大值对应的整行
推荐使用 idxmax() + .loc 组合,这是最直观且保留所有原始列的方式:
# 获取每组中 A 列值最大的行索引
idx = df.groupby('B')['A'].idxmax()
# 用索引定位原 DataFrame 的对应行
result = df.loc[idx].sort_index() # sort_index() 可选,使结果按原始顺序近似排列
# 若需恢复日期为原始字符串格式(如导出报表)
result['A'] = result['A'].dt.strftime('%d/%m/%Y')
print(result)输出结果与预期完全一致:
A B E 0 26/12/2023 apple 7,9 2 26/12/2023 pear 28,6 3 26/12/2022 orange 33,3 4 26/12/2023 wildberry 24,7 6 26/12/2023 grapes 17,1
⚠️ 注意事项
- ❌ 避免直接使用 df.groupby('B').max():它会对所有数值列(包括 E)做最大值聚合,导致业务数据被意外篡改;
- ✅ idxmax() 返回索引而非值,配合 .loc 可精准提取原始整行,安全可靠;
- ? 若日期格式不统一(含不同分隔符或年月日顺序),建议先用 pd.to_datetime(..., errors='coerce') 并检查 NaT 值;
- ? 进阶技巧:如需同时保留“最新日期”和“对应 E 值”,也可用 df.sort_values('A').drop_duplicates('B', keep='last'),逻辑更易理解,性能在大数据量下略低但可读性极佳。
掌握这一模式,你就能高效处理商品最新报价、用户最后登录、设备最新状态等典型时效性数据清洗任务。










