如何用Pandas按year分组获取vol最小值及对应date?
问题解法说明
你的原代码存在逻辑问题:groupby('year').min()[['date', 'vol']]会对分组后的date和vol字段分别取最小值,得到的是分组内最早的日期和最小的成交量,这两个值并不一定来自同一行,和你需要的「vol最小值对应的date」需求不符。
以下是几种可行的解决方法:
方法一:用idxmin()定位索引后提取
# 获取每组vol最小值对应的行索引 min_vol_indices = pandas_df.groupby('year')['vol'].idxmin() # 根据索引提取对应行的date和vol result = pandas_df.loc[min_vol_indices, ['date', 'vol']].reset_index(drop=True)
方法二:用transform标记筛选
# 标记每行是否为所在year组的vol最小值行 pandas_df['is_min_vol'] = pandas_df['vol'] == pandas_df.groupby('year')['vol'].transform('min') # 筛选目标行并保留所需列 result = pandas_df[pandas_df['is_min_vol']][['date', 'vol']].reset_index(drop=True)
方法三:用agg自定义聚合逻辑
result = pandas_df.groupby('year').agg( vol=('vol', 'min'), date=('date', lambda x: x[pandas_df.loc[x.index, 'vol'] == pandas_df.loc[x.index, 'vol'].min()].iloc[0]) ).reset_index(drop=True)
执行后,result中的每一行都会对应某一年的最小成交量,以及该成交量发生的日期,单组结果会符合你给出的示例格式(如1997-07-14 1162876)。
内容的提问来源于stack exchange,提问作者Pirvu Georgian
相关产品推荐
相关产品推荐

