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

按ID分组获取最小日期及对应邮政编码的Pandas实现问题

解决按ID分组获取最小日期及对应ZIPCODE的问题

我来帮你搞定这个需求!你想要按ID分组,拿到每个ID对应的最早日期,以及该日期对应的ZIPCODE,之前用pivot_table的方式确实走偏了——因为把ZIPCODE也加入了索引分组,导致结果里会出现同一ID下不同ZIPCODE的最小日期,完全不是我们要的单一对应关系。下面给你两种简单可靠的实现方法:

方法一:排序后去重(直观易理解)

首先必须把DATE列转换成datetime类型,否则字符串格式的日期没法正确比较大小:

import pandas as pd

# 先转换日期列类型(指定格式确保转换准确)
df['DATE'] = pd.to_datetime(df['DATE'], format='%m/%d/%Y')

# 按ID和DATE升序排序,然后对ID去重,保留每组第一个(最小日期的记录)
result = df.sort_values(['ID', 'DATE']).drop_duplicates('ID', keep='first')

# 保留需要的列并重置索引(可选,让结果更整洁)
result = result[['ID', 'DATE', 'ZIPCODE']].reset_index(drop=True)

方法二:用groupby+idxmin(更高效)

这种方法直接定位到每个ID最小日期对应的行索引,再提取整行数据:

import pandas as pd

# 同样先转换日期类型
df['DATE'] = pd.to_datetime(df['DATE'], format='%m/%d/%Y')

# 获取每个ID最小日期对应的行索引
min_date_indices = df.groupby('ID')['DATE'].idxmin()

# 根据索引提取目标行,重置索引让结果更规范
result = df.loc[min_date_indices, ['ID', 'DATE', 'ZIPCODE']].reset_index(drop=True)

预期输出

运行任意一种方法后,都会得到你想要的结果:

ID       DATE ZIPCODE
0  196512 2016-03-01   96512
1  196795 2015-01-01   03452

为什么原代码不行?

你之前用的pd.pivot_table(df,index=["ID","ZIPCODE"],values=["DATE"],aggfunc=min)是按ID+ZIPCODE的组合分组,取每组的最小日期,这会返回同一ID下所有ZIPCODE对应的最小日期,完全不符合“每个ID仅返回最小日期及对应ZIPCODE”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:23:36