如何在DataFrame中按layer和FP_part分组获最小accuracy并保留idx列?
问题与解决方案
原始数据
我有如下DataFrame:
layer idx FP_part accuracy conv2d 0 Mantissa 0.683099 conv2d 1 Mantissa 0.683099 conv2d 2 Mantissa 0.683099 conv2d 3 Mantissa 0.683099 conv2d 4 Mantissa 0.683099 conv2d 0 Mantissa 0.683099 conv2d 1 Exponent 0.683099 conv2d 2 Exponent 0.683099 conv2d 3 Exponent 0.683099 conv2d 4 Exponent 0.683099 dense_2 0 Mantissa 0.682965 dense_2 1 Mantissa 0.682836 dense_2 2 Mantissa 0.682940 dense_2 3 Mantissa 0.416586 dense_2 4 Mantissa 0.682983 dense_2 0 Exponent 0.682965 dense_2 1 Exponent 0.682836 dense_2 2 Exponent 0.682940 dense_2 3 Exponent 0.416586 dense_2 4 Exponent 0.682983
需求与问题
我需要按layer和FP_part分组,获取每组的最小accuracy值,同时保留对应的idx列。但尝试下面的代码后,idx列被移除了:
df_wim = df_w.groupby(['layer',"FP_part"])['accuracy'].min().reset_index()
解决方案
方法1:用idxmin()定位最小行
直接找到每组中accuracy最小的行索引,再提取整行数据,这样就能保留所有列:
# 获取每组accuracy最小值对应的行索引 min_row_indices = df_w.groupby(['layer', 'FP_part'])['accuracy'].idxmin() # 根据索引提取行,重置索引 df_wim = df_w.loc[min_row_indices].reset_index(drop=True)
方法2:计算最小值后合并回原表
先算出每组的最小accuracy,再通过合并匹配到对应行:
import pandas as pd # 计算每组的最小accuracy grouped_min = df_w.groupby(['layer', 'FP_part'])['accuracy'].min().reset_index() # 合并原表,保留对应idx,去重(避免同组多个最小值行重复) df_wim = pd.merge(df_w, grouped_min, on=['layer', 'FP_part', 'accuracy']).drop_duplicates()
方法3:用transform标记最小值行
给每行标记是否为本组的accuracy最小值,再筛选出这些行:
# 标记每行是否是本组的accuracy最小值 df_w['is_min_accuracy'] = df_w.groupby(['layer', 'FP_part'])['accuracy'].transform(lambda x: x == x.min()) # 筛选标记为True的行,删除辅助列并重置索引 df_wim = df_w[df_w['is_min_accuracy']].drop('is_min_accuracy', axis=1).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者nechi
相关产品推荐
相关产品推荐

