如何在Pandas DataFrame分组后获取含Date列的最新数据
解决方法
问题出在你把Date设为了索引列,所以分组后的df_company里没有单独的Date列。以下几种修改方式可以获取带Date列的最新数据:
方法1:将Date从索引移回数据列
直接重置索引,让Date回到列中,之后分组取最新行时自然包含Date:
data = pd.DataFrame({'Price': [12, 9, 11, 10, 7, 21, 23], 'Date': ['1991-01-01', '1991-02-01', '1991-03-01', '1991-01-01', '1991-02-01', '1991-03-01', '1991-04-01'], 'Company': ['A', 'A', 'A', 'B', 'B', 'B', 'B']}) # 先把Date转成datetime类型,确保排序逻辑正确 data['Date'] = pd.to_datetime(data['Date']) # 不需要把Date设为索引,或者之后重置索引 # data.set_index(['Date', 'Company'], inplace=True) # data = data.reset_index() for company_name, df_company in data.groupby('Company'): # 按Date排序后取最后一行 last_row = df_company.sort_values('Date').iloc[-1] # last_row包含Date、Company、Price所有列 # 后续函数处理逻辑
方法2:从索引中提取Date并添加到结果
如果必须保留原索引结构,可以从索引中提取最新的Date值,手动添加到结果里:
data = pd.DataFrame({'Price': [12, 9, 11, 10, 7, 21, 23], 'Date': ['1991-01-01', '1991-02-01', '1991-03-01', '1991-01-01', '1991-02-01', '1991-03-01', '1991-04-01'], 'Company': ['A', 'A', 'A', 'B', 'B', 'B', 'B']}) data['Date'] = pd.to_datetime(data['Date']) data.set_index(['Date', 'Company'], inplace=True) for company_name, df_company in data.groupby('Company'): latest_date = df_company.index.get_level_values('Date').max() last_values = df_company.loc[latest_date].iloc[0].copy() # 将Date添加到结果中 last_values['Date'] = latest_date # 现在last_values包含Price和Date字段 # 后续函数处理逻辑
方法3:用idxmax直接定位最新行(更简洁)
利用groupby的idxmax方法直接获取每组最新日期对应的行索引,一步到位:
data = pd.DataFrame({'Price': [12, 9, 11, 10, 7, 21, 23], 'Date': ['1991-01-01', '1991-02-01', '1991-03-01', '1991-01-01', '1991-02-01', '1991-03-01', '1991-04-01'], 'Company': ['A', 'A', 'A', 'B', 'B', 'B', 'B']}) data['Date'] = pd.to_datetime(data['Date']) # 循环版本 for company_name, df_company in data.groupby('Company'): latest_row = df_company.loc[df_company['Date'].idxmax()] # latest_row包含所有列 # 后续函数处理逻辑 # 如果不需要循环,直接获取所有公司的最新数据 all_latest_data = data.loc[data.groupby('Company')['Date'].idxmax()]
内容的提问来源于stack exchange,提问作者user3104352
相关产品推荐
相关产品推荐

