基于合同表条件检查填充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
相关产品推荐
相关产品推荐

