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

如何从Pandas DataFrame中提取每个ID对应每年的最小日期所在行

问题原因

你原代码的分组维度不符合需求:额外加入了Year作为分组键,会取出每个ID对应每一年的最小月份行,而你需要的是每个ID整体的最早月份对应的行,分组键仅保留ID即可。另外建议先将Month列转换为日期类型,避免字符串比较的潜在异常。

正确实现代码

方法1:修改原有transform逻辑

import pandas as pd

# 原有数据初始化逻辑不变
data = [{'Month': '2020-12-01', 'Year':'2020', 'ID':'123', 'Expense':1000, 'Revenue':5000, 'Building':'Stadium'}, 
       {'Month': '2019-02-01', 'Year':'2019', 'ID':'123', 'Expense':3000, 'Revenue':4000, 'Building':'Stadium'},
       {'Month': '2018-01-01', 'Year':'2018', 'ID':'234', 'Expense':7000, 'Revenue':5000, 'Building':'Library'}, 
       {'Month': '2021-04-01', 'Year':'2021', 'ID':'234', 'Expense':3000, 'Revenue':4000, 'Building':'Library'},
       {'Month': '2020-01-01', 'Year':'2020', 'ID':'789', 'Expense':5000, 'Revenue':6000, 'Building':'Casino'}, 
       {'Month': '2019-02-01', 'Year':'2019', 'ID':'789', 'Expense':5000, 'Revenue':4000, 'Building':'Casino'},
       {'Month': '2018-12-01', 'Year':'2018', 'ID':'789', 'Expense':5000, 'Revenue':9000, 'Building':'Casino'},
       {'Month': '2017-10-01', 'Year':'2017', 'ID':'123', 'Expense':1000, 'Revenue':5000, 'Building':'Stadium'}]
df = pd.DataFrame(data)

# 转换Month为日期类型,保证日期比较逻辑正确
df['Month'] = pd.to_datetime(df['Month'])

# 仅按ID分组取最小月份对应的行
df_new = df[df.groupby('ID')['Month'].transform('min') == df['Month']].reset_index(drop=True)

方法2:排序后去重(性能更优,适合大数据量)

df['Month'] = pd.to_datetime(df['Month'])
df_new = df.sort_values('Month').drop_duplicates('ID', keep='first').reset_index(drop=True)

两种方法输出的结果都和你要求的格式一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:39:01