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

在Pandas GroupBy分组中条件保留重复项的最新DateSent记录(排除ID为6T的情况)

解决方案:Pandas实现分组保留最新记录(含特殊ID处理)

嘿,这个需求用Pandas完全可以轻松搞定,我给你分享两种实用的方法,你可以根据自己的习惯选择:

你的数据集(CSV格式)

ID,DateAcquired,DateSent
1,20210518,20220110
1,20210719,20220210
1,20210719,20220310
1,20200420,20220410
1,20210328,20220510
1,20210518,20220610
2,20210108,20220110
2,20210110,20220210
2,20210119,20220310
2,20210108,20220410
2,20200109,20220510
2,20210919,20220610
2,20211214,20220612
2,20210812,20220620
2,20210909,20220630
2,20200102,20220811
2,20200608,20220909
2,20210506,20221005
2,20210130,20221101
3,20210518,20220110
3,20210519,20220210
3,20210520,20220310
3,20210518,20220410
3,20210611,20220510
3,20210521,20220610
3,20210723,20220612
3,20211211,20220620
4,20210518,20220110
4,20210519,20220210
4,20210520,20220310
4,20210618,20220410
4,20210718,20220510
4,20210818,20220610
5,20210518,20220110
5,20210818,20220210
5,20210918,20220310
5,20211018,20220410
5,20211113,20220510
5,20211218,20220610
5,20210631,20221212
6T,20200102,20201101
6T,20200102,20201101
6T,20200102,20201101
6T,20210405,20220610
6T,20210606,20220611

方法1:拆分数据处理后合并

这种方法逻辑清晰,适合新手理解:

import pandas as pd

# 假设你的数据已经读取为DataFrame:data = pd.read_csv('your_file.csv')

# 1. 拆分出需要处理的非6T数据和不需要处理的6T数据
non_6t_data = data[data['ID'] != '6T']
six_t_data = data[data['ID'] == '6T']

# 2. 对非6T数据分组,每组保留DateSent最大的行
# idxmax()返回组内DateSent最大值对应的行索引,loc提取这些行
processed_non_6t = non_6t_data.loc[
    non_6t_data.groupby(['ID', 'DateAcquired'])['DateSent'].idxmax()
]

# 3. 合并两部分数据,可选按ID排序让结果更整洁
final_result = pd.concat([processed_non_6t, six_t_data]).sort_values(by='ID')

# 查看结果
print(final_result)

方法2:用标记列一步筛选

这种方法不用拆分数据,代码更紧凑:

import pandas as pd

# 1. 给每行添加标记:是否是当前(ID, DateAcquired)组内DateSent最大的行
data['is_latest_sent'] = data.groupby(['ID', 'DateAcquired'])['DateSent'].transform(
    lambda x: x == x.max()
)

# 2. 筛选条件:要么是6T的所有行,要么是非6T且标记为最新的行
final_result = data[
    (data['ID'] == '6T') | ((data['ID'] != '6T') & data['is_latest_sent'])
]

# 可选删除临时标记列
final_result = final_result.drop(columns='is_latest_sent')

# 查看结果
print(final_result)

关键说明

  • 两种方法都能实现需求,方法1的效率更高,尤其是当数据集很大的时候,因为idxmax比transform的计算量更小。
  • 你的DateSent是数值格式(比如20220110),直接比较大小是有效的;如果是字符串格式,需要先转成日期类型再比较,但你的数据看起来是纯数字的日期,直接用数值比较没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:07:37