如何在agg聚合中使用idxmax获取其他列的对应值
Pandas分组聚合获取极值对应日期的解决方案
方法1:在agg中直接结合idxmax/idxmin提取日期
你可以通过自定义lambda函数,在agg操作里针对每个分组,用idxmax找到High最大值对应的原DataFrame索引,再提取对应的Date字段。同理处理Low最小值的日期,代码示例如下:
import pandas as pd weekly = df.groupby(['Year', 'Qtr_Year'], as_index=False).agg( High=('High', 'max'), Date_High=('High', lambda x: df.loc[x.idxmax(), 'Date']), Low=('Low', 'min'), Date_Low=('Low', lambda x: df.loc[x.idxmin(), 'Date']) )
方法2:用groupby.apply实现更直观的逻辑
如果觉得lambda写法不够清晰,可通过自定义函数处理每个分组,逻辑更直白:
def extract_extreme_dates(group): # 获取最大值对应的索引和日期 high_max_idx = group['High'].idxmax() high_date = group.loc[high_max_idx, 'Date'] # 获取最小值对应的索引和日期 low_min_idx = group['Low'].idxmin() low_date = group.loc[low_min_idx, 'Date'] return pd.Series({ 'Year': group['Year'].iloc[0], 'Qtr_Year': group['Qtr_Year'].iloc[0], 'High': group['High'].max(), 'Date_High': high_date, 'Low': group['Low'].min(), 'Date_Low': low_date }) weekly = df.groupby(['Year', 'Qtr_Year']).apply(extract_extreme_dates).reset_index(drop=True)
关于你尝试的df.loc方法
这种思路完全可行,本质上方法1就是把df.loc结合idxmax/idxmin的逻辑封装到了agg的lambda函数中,只要注意分组后idxmax返回的是原DataFrame的全局索引,直接用df.loc就能正确匹配到对应行的日期。
内容的提问来源于stack exchange,提问作者Yogesh Kamboj
相关产品推荐
相关产品推荐

