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

基于合同表条件检查填充SumsOfPayments空DataFrame的方案咨询

实现方案

前置依赖

确保已导入pandas库,且所有合同表的YearXPayday字段已转换为与SumsOfPayments索引格式一致的datetime类型。

步骤1:编写通用宽表转换汇总函数

因为四类客户的合同表结构完全一致,封装统一处理函数减少重复代码:

import pandas as pd

def sum_payments_by_date(contract_df: pd.DataFrame) -> pd.Series:
    payment_records = []
    # 遍历1-5年的付款字段对
    for year_num in range(1, 6):
        payday_col = f"Year{year_num}Payday"
        amount_col = f"Year{year_num}Amount"
        # 过滤空值后提取对应两列,重命名后存入列表
        valid_records = contract_df[[payday_col, amount_col]].dropna()
        valid_records.columns = ["pay_date", "amount"]
        payment_records.append(valid_records)
    
    # 合并所有付款记录后按日期分组求和
    all_records = pd.concat(payment_records, ignore_index=True)
    return all_records.groupby("pay_date")["amount"].sum()

步骤2:分别处理四类客户的合同表

调用上述函数得到每类客户按日期汇总的付款金额序列:

# 变量名请替换为你实际的表名
annual_total = sum_payments_by_date(AnnualContracts)
half_year_total = sum_payments_by_date(HalfYearContracts)
quarter_total = sum_payments_by_date(QuarterContracts)
monthly_total = sum_payments_by_date(MonthlyContracts)

步骤3:匹配填充到目标DataFrame

利用pandas索引自动匹配的特性,直接赋值到对应列即可,无匹配值的位置默认填充NaN,可根据需要替换为0:

# 列名请替换为你SumsOfPayments中对应的列名
SumsOfPayments["年付客户"] = SumsOfPayments.index.map(annual_total)
SumsOfPayments["半年付客户"] = SumsOfPayments.index.map(half_year_total)
SumsOfPayments["季付客户"] = SumsOfPayments.index.map(quarter_total)
SumsOfPayments["月付客户"] = SumsOfPayments.index.map(monthly_total)

# 可选:无付款记录的日期填充为0
SumsOfPayments = SumsOfPayments.fillna(0)

注意事项

  • 如果你的字段命名规则和示例不一致,调整函数内的列名字符串拼接逻辑即可
  • 若后续需要将非1日的付款日归属到对应月份的1日统计,可在分组前添加代码:all_records["pay_date"] = all_records["pay_date"].dt.to_period('M').dt.to_timestamp()
  • 若存在时区差异,需先统一所有日期字段的时区,避免等值匹配失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 21:27:03