如何用Pandas按Segment提取对应最低Cost的所有Part ID列表?
解决方案
首先处理数据清洗与格式转换(原数据包含无效行和带$符号的字符串型成本):
# 移除Segment为'-'的无效行 df = df[df['Segment'] != '-'].reset_index(drop=True) # 将Cost列转换为数值类型(去除$符号) df['Cost'] = df['Cost'].str.replace('$', '').astype(float)
方法一:直接分组聚合完成目标
通过groupby结合自定义聚合逻辑,一次性生成所需结果:
result = df.groupby('Segment').agg( Part_List=('Part ID', lambda x: x[df.loc[x.index, 'Cost'] == df.loc[x.index, 'Cost'].min()].tolist()), Min_Cost=('Cost', lambda x: f"${x.min()}") ).reset_index().rename(columns={'Part_List': 'Part List', 'Min_Cost': 'Min. Cost'})
方法二:基于已生成的分组最低成本列扩展
利用你已实现的transform逻辑生成分组最低成本列,再筛选后聚合:
# 添加分组内的最低成本列(你已完成的步骤) df['Min Segment Price'] = df.groupby('Segment')['Cost'].transform(min) # 筛选出当前Segment内成本等于最低成本的行 filtered_df = df[df['Cost'] == df['Min Segment Price']] # 分组聚合得到Part列表和最低成本 result = filtered_df.groupby('Segment').agg( Part_List=('Part ID', list), Min_Cost=('Cost', lambda x: f"${x.iloc[0]}") ).reset_index().rename(columns={'Part_List': 'Part List', 'Min_Cost': 'Min. Cost'})
你之前方法失效的原因
- 使用
df['Cost'].min()时,取的是整个DataFrame的全局最低成本,而非每个Segment分组内的最小值,因此只能匹配到全局最低对应的Part ID,无法按Segment分组处理。 - 必须将筛选逻辑绑定到分组上下文:要么在聚合函数内针对每组单独计算最小值并筛选,要么通过
transform先得到每组的最小值,再做全局筛选后再次分组聚合。
内容的提问来源于stack exchange,提问作者Stephen Juza
相关产品推荐
相关产品推荐

