You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:05:47