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

