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

如何保留DataFrame中B列每组对应A列最新日期的行?

按分组保留DataFrame中最新日期的行

核心步骤说明

首先要把日期列(A列)转换成日期类型,否则字符串格式的日期直接比较大小会出错。之后通过分组筛选出每个类别(B列)对应的最新日期行。

完整代码实现

1. 构造示例数据并转换日期格式

import pandas as pd

# 构造你提供的示例数据
data = {
    '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']
}
df = pd.DataFrame(data)

# 把A列从字符串转成日期格式(dayfirst=True适配日/月/年的格式)
df['A'] = pd.to_datetime(df['A'], dayfirst=True)

2. 方法一:用groupby+transform+loc实现(解决你的loc困惑)

# 对每个B组,计算该组的最新日期,并把结果映射到每一行
group_max_date = df.groupby('B')['A'].transform('max')
# 用loc筛选出A列等于所在组最新日期的行
df_filtered = df.loc[df['A'] == group_max_date]

为什么用transform? 直接groupby('B')['A'].max()只会得到每个B对应一个日期,没法直接和原DataFrame的行匹配。transform会把分组计算的结果广播回原数据的每一行,这样每一行都能拿到自己所在组的最新日期,再用loc筛选就顺理成章了。

3. 方法二:更简洁的排序+去重

# 先按B列升序、A列降序排序,这样每个B组的第一行就是最新日期
df_filtered = df.sort_values(['B', 'A'], ascending=[True, False])
# 保留每个B组的第一行,自动删除重复的旧日期行
df_filtered = df_filtered.drop_duplicates('B').reset_index(drop=True)

最终结果

A          B      E
0 2023-12-26       apple    7,9
1 2023-12-26        pear   28,6
2 2022-12-26       orange  33,3
3 2023-12-26  wildberry   24,7
4 2023-12-26       grapes  17,1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 23:30:26