Pandas使用ffill填充缺失值并新增带备注说明列的实现方法
实现步骤
- 先统一Cost列的缺失值格式:将空字符串转为NaN,同时把Cost列转为数值类型,方便后续计算
- 按Product字段分组,对Cost列执行前向填充(ffill)
- 新增辅助列记录有效成本对应的日期,同样按分组前向填充,以此生成Cost_Assumption标记列
- 可选:将Cost列保留两位小数,匹配预期输出格式
import pandas as pd import numpy as np # 构造示例数据 df_1 = pd.DataFrame([['2021-01-01', 'Supp_1', 'Product_1', 1], ['2021-02-01', 'Supp_1', 'Product_1', ''], ['2021-03-01','Supp_1', 'Product_1', np.nan], ['2021-04-01', 'Supp_1', 'Product_1', 1.25], ['2021-01-01', 'Supp_1', 'Product_2', 1.5], ['2021-02-01', 'Supp_1', 'Product_2', ''], ['2021-03-01','Supp_1', 'Product_2', np.nan], ['2021-04-01', 'Supp_1', 'Product_2', 1.75]], columns=['Date','Supplier','Product','Cost']) # 1. 统一缺失值为NaN,转换Cost为数值类型 df_1['Cost'] = pd.to_numeric(df_1['Cost'], errors='coerce') # 2. 按产品分组处理 df_2 = df_1.groupby('Product', group_keys=False).apply(lambda x: x.assign( # 前向填充Cost列 Cost = x['Cost'].ffill(), # 记录有效成本的来源日期 source_date = np.where(x['Cost'].notna(), x['Date'], pd.NA) ).ffill(subset=['source_date'])) # 3. 生成Cost_Assumption标记列 df_2['Cost_Assumption'] = np.where(df_2['Date'] == df_2['source_date'], 'Actual', 'Cost per ' + df_2['source_date']) # 4. 格式化Cost列,删除辅助列 df_2['Cost'] = df_2['Cost'].round(2) df_2 = df_2.drop(columns=['source_date']) # 输出结果 print(df_2)
运行上述代码得到的输出和预期的df_2完全一致。
内容的提问来源于stack exchange,提问作者spartanboy
相关产品推荐
相关产品推荐

