Pandas中按商品及日期分组填充purchase_price_unit列NaN值遇阻求助
问题分析与解决方案
核心问题原因
你同时按purchase_item和purchase_date分组后无法填充,本质是每个分组仅包含同一商品同一日期的数据,组内没有更早的历史记录(比如上月数据),ffill()(向前填充)自然找不到可复用的前值,所以完全无效。
你的需求是「同商品下用上月对应价格填充NaN」,正确的分组逻辑应该是仅按商品分组,在每个商品组内按日期排序后再做向前填充——这样才能让NaN值取到该商品上一个时间点(上月)的有效价格。
修正后的代码实现
import pandas as pd # 确保purchase_date是datetime格式(如果原本不是的话) purchase_df['purchase_date'] = pd.to_datetime(purchase_df['purchase_date']) # 按商品分组,组内按日期升序排序后对价格列做向前填充 purchase_df['purchase_price_unit'] = purchase_df.groupby('purchase_item', group_keys=False) \ .apply(lambda x: x.sort_values('purchase_date')['purchase_price_unit'].ffill())
额外说明
- 如果你的日期是「年月」格式(比如
2024-01),pd.to_datetime()依然可以正确识别,排序逻辑不受影响。 - 加上
group_keys=False是为了避免分组键被添加到结果索引中,保持原DataFrame结构一致。 - 如果需要用下月值填充本月NaN,可将
ffill()替换为bfill(),逻辑同理。
内容的提问来源于stack exchange,提问作者Arpan Ghimire
相关产品推荐
相关产品推荐

