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

多条件下从另一DataFrame填充缺失值的技术实现咨询

问题描述

现有两个DataFrame:

  • 季度DataFrame:记录3/6/9/12月的数据
  • 半年度DataFrame:仅记录6/12月的数据

需按以下规则填充半年度DataFrame的缺失值:

  • 规则1:若半年度表的Value_1、Value_3为缺失值,从季度表中匹配相同姓名+年月的对应值填充(仅匹配6/12月的季度数据)
  • 规则2:若半年度表的Value_2为缺失值,从季度表中累加对应半年周期的相关月份值填充:6月累加3月+6月数据,12月累加9月+12月数据

现有代码仅实现规则1,需完善以覆盖全部规则。

解决方案

步骤1:预处理数据,统一缺失值格式

首先处理原始数据中的字符串'NA':

  • 若季度表中的'NA'代表无值(不计入累加),替换为Pandas识别的pd.NA
  • 若季度表中的'NA'代表数值0,替换为0
  • 半年度表中的'NA'统一替换为pd.NA,确保填充逻辑生效
import pandas as pd

# 加载原始数据
dt_quarter= [['John','2022-03',1,5,9], ['John','2022-06',2,'NA',10], ['John','2022-09','NA',7,11], ['John','2022-12',4,8,12],
         ['Dave','2021-03','NA',5,10], ['Dave','2021-06',20,'NA',10], ['Dave','2021-09',10,5,8], ['Dave','2021-12','NA','NA',30]]
df_quarter= pd.DataFrame(dt_quarter, columns=['Name','Date','Value_1','Value_2','Value_3'])

dt_semi= [['John','2022-06','NA','NA',30], ['John','2022-12',50,'NA','NA'],
         ['Dave','2021-06','NA','NA','NA'], ['Dave','2021-12',30,20,10]]
df_semi= pd.DataFrame(dt_semi, columns=['Name','Date','Value_1','Value_2','Value_3'])

# 预处理缺失值(根据业务需求二选一)
# 选项1:'NA'代表无值,不计入累加
# df_quarter = df_quarter.replace('NA', pd.NA)
# 选项2:'NA'代表数值0,计入累加
df_quarter = df_quarter.replace('NA', 0)
df_semi = df_semi.replace('NA', pd.NA)

步骤2:实现规则1,填充Value_1和Value_3

通过Name+Date索引匹配,从季度表提取对应值填充半年度表的缺失项:

group_cols = ['Name', 'Date']
df_semi_updated = df_semi.set_index(group_cols).copy()

# 填充Value_1和Value_3
df_semi_updated[['Value_1', 'Value_3']] = df_semi_updated[['Value_1', 'Value_3']].fillna(
    df_quarter.set_index(group_cols)[['Value_1', 'Value_3']]
).reset_index()

步骤3:实现规则2,计算并填充Value_2的累加值

给季度数据标记所属的半年度结束月份,按Name+半年度结束月份分组累加Value_2,再匹配填充到半年度表:

# 转换日期格式,生成半年度结束月份标记
df_quarter['Date'] = pd.to_datetime(df_quarter['Date'])
df_quarter['Semi_End_Date'] = df_quarter['Date'].dt.to_period('M').apply(
    lambda x: f"{x.year}-06" if x.month <=6 else f"{x.year}-12"
)

# 按姓名+半年度结束月份累加Value_2
semi_value2_sum = df_quarter.groupby(['Name', 'Semi_End_Date'])['Value_2'].sum().reset_index()

# 匹配填充半年度表的Value_2缺失值
df_semi_updated = df_semi_updated.merge(
    semi_value2_sum,
    left_on=['Name', 'Date'],
    right_on=['Name', 'Semi_End_Date'],
    how='left'
)
# 保留原有非缺失值,用累加值填充缺失项
df_semi_updated['Value_2'] = df_semi_updated['Value_2_x'].fillna(df_semi_updated['Value_2_y'])

# 清理冗余列
df_semi_updated = df_semi_updated.drop(columns=['Value_2_x', 'Value_2_y', 'Semi_End_Date'])

最终结果

以“NA代表数值0”为例,填充后的半年度DataFrame如下:

Name      Date  Value_1  Value_2  Value_3
0   John  2022-06        2        5       30
1   John  2022-12       50       15       12
2   Dave  2021-06       20        5       10
3   Dave  2021-12       30       20       10

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:24:52