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

Pandas如何按唯一order_id保留最小cost行并处理空值?

解决方案

直接把两种场景的结果合并即可,先处理有有效cost的订单,再单独提取全为空的订单行,最后拼接:

import pandas as pd

# 1. 提取每个order_id中cost最小的行(全NaN的组会被自动排除,因为idxmin对全NaN组返回NaN)
valid_cost_rows = ol3.loc[ol3.groupby('order_id')['cost'].idxmin()]

# 2. 找出所有cost全为NaN的order_id
all_nan_order_ids = ol3.groupby('order_id')['cost'].apply(lambda g: g.isna().all())
all_nan_order_ids = all_nan_order_ids[all_nan_order_ids].index

# 3. 从原数据中提取这些全NaN订单,每个仅保留第一行
all_nan_rows = ol3[ol3['order_id'].isin(all_nan_order_ids)].drop_duplicates(subset='order_id', keep='first')

# 4. 合并两部分结果,可选sort_index保持原数据的行顺序
final_result = pd.concat([valid_cost_rows, all_nan_rows]).sort_index()

关键逻辑说明:

  • groupby('order_id')['cost'].idxmin() 能精准定位每个订单的最低cost行,但如果组内所有cost都是NaN,这个方法会返回NaN,因此valid_cost_rows里只会包含有有效cost值的订单数据。
  • 用apply(lambda g: g.isna().all())可以筛选出所有cost全为空的订单ID,避免误保留那些既有NaN又有有效cost的订单的空值行(这是你之前代码的小问题)。
  • 最后通过pd.concat合并两组结果,sort_index可以让结果和原数据的行顺序保持一致,按需选择是否保留。

内容的提问来源于stack exchange,提问作者Philip Hostetler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:10:25