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

Python DataFrame嵌套循环语法错误:合约数据按月拆分失败

问题分析与解决

你的代码错在哪

  1. Python循环语法完全错误:Python里没有for 变量 = 起始值 to 结束值这种写法,正确的迭代范围要用range(),但你这里的逻辑是针对每一行合约生成日期序列,直接操作整列根本行不通。
  2. 遍历DataFrame的方式不对:for contracts in Exposure_Data_Condense会遍历DataFrame的列名,不是每一行合约数据,完全没达到遍历行的目的。
  3. 思路不符合Pandas的使用习惯:Pandas是向量化处理工具,这种行扩展需求不该用嵌套循环硬写,效率低还容易出错。

正确实现代码

先把日期列转成datetime类型,然后为每一行生成对应的年月序列,再展开成多行:

import pandas as pd

# 确保Policy_Start和Policy_End是datetime格式(如果还不是的话)
Exposure_Data_Condense['Policy_Start'] = pd.to_datetime(Exposure_Data_Condense['Policy_Start'])
Exposure_Data_Condense['Policy_End'] = pd.to_datetime(Exposure_Data_Condense['Policy_End'])

# 定义函数:为单个合约生成从起始到结束的所有年月
def generate_monthly_exposure(row):
    # 生成从起始月到结束月的日期序列,freq='MS'代表每月第一天
    date_range = pd.date_range(start=row['Policy_Start'], end=row['Policy_End'], freq='MS')
    # 提取年月,转成YYYYMM格式的整数
    return date_range.strftime('%Y%m').astype(int)

# 为每一行生成年月序列,然后炸开成多行
expanded_data = Exposure_Data_Condense.assign(
    Exposure_Month_Year=Exposure_Data_Condense.apply(generate_monthly_exposure, axis=1)
).explode('Exposure_Month_Year').reset_index(drop=True)

# 拆分出Exposure_Year和Exposure_Month列(如果需要的话)
expanded_data['Exposure_Year'] = expanded_data['Exposure_Month_Year'] // 100
expanded_data['Exposure_Month'] = expanded_data['Exposure_Month_Year'] % 100

# 查看结果
print(expanded_data.head())

代码说明

  1. 先把日期列转成datetime,确保能生成正确的日期序列。
  2. generate_monthly_exposure函数针对每一行合约,生成从起始到结束的所有月份的第一天,再转成YYYYMM的整数格式。
  3. apply函数把这个逻辑应用到每一行,生成的序列存到新列里,再用explode把序列炸开成单独的行,完成扩展。
  4. 最后拆分出年和月列,满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 09:35:21