如何在Pandas DataFrame中按lane id获取最低报价及对应供应商
解决方案
下面给你几种可行的方法,实现按lane_id分组后提取每组最低quoted_rates及对应供应商:
方法一:分组取索引再提取行
这种方法直接定位每组最低价的行索引,精准提取所需数据:
# 按lane_id分组,获取每组quoted_rates最小的行索引 min_row_indices = df.groupby('lane_id')['quoted_rates'].idxmin() # 根据索引提取对应行,保留需要的列 result_df = df.loc[min_row_indices, ['lane_id', 'supplier_name', 'quoted_rates']] # 重置索引让结果更规整 result_df = result_df.reset_index(drop=True)
方法二:排序后去重
如果需要更直观的排序逻辑,先按分组和价格排序,再保留每组第一条数据:
# 先按lane_id升序、quoted_rates升序排序 sorted_data = df.sort_values(by=['lane_id', 'quoted_rates'], ascending=[True, True]) # 按lane_id去重,保留每组第一行(即最低价的行) result_df = sorted_data.drop_duplicates(subset='lane_id', keep='first')[['lane_id', 'supplier_name', 'quoted_rates']]
方法三:标记组内最低价后筛选
如果存在多个供应商报出相同最低价的情况,这种方法可以保留所有符合条件的行:
# 新增列标记每组的最低报价 df['group_min_rate'] = df.groupby('lane_id')['quoted_rates'].transform('min') # 筛选出报价等于组内最低价的行 result_df = df[df['quoted_rates'] == df['group_min_rate']][['lane_id', 'supplier_name', 'quoted_rates']] # 重置索引 result_df = result_df.reset_index(drop=True)
注意:如果你的
lane_id列名有大小写差异(比如Lane ID),记得替换成实际列名;方法一和二默认只保留每组第一个最低价的行,方法三会保留所有同价的供应商。
内容的提问来源于stack exchange,提问作者kofi nkrumah
相关产品推荐
相关产品推荐

