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
相关产品推荐
相关产品推荐

