如何从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
相关产品推荐
相关产品推荐

