Python DataFrame嵌套循环语法错误:合约数据按月拆分失败
问题分析与解决
你的代码错在哪
- Python循环语法完全错误:Python里没有
for 变量 = 起始值 to 结束值这种写法,正确的迭代范围要用range(),但你这里的逻辑是针对每一行合约生成日期序列,直接操作整列根本行不通。 - 遍历DataFrame的方式不对:
for contracts in Exposure_Data_Condense会遍历DataFrame的列名,不是每一行合约数据,完全没达到遍历行的目的。 - 思路不符合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())
代码说明
- 先把日期列转成datetime,确保能生成正确的日期序列。
generate_monthly_exposure函数针对每一行合约,生成从起始到结束的所有月份的第一天,再转成YYYYMM的整数格式。apply函数把这个逻辑应用到每一行,生成的序列存到新列里,再用explode把序列炸开成单独的行,完成扩展。- 最后拆分出年和月列,满足你的需求。
内容的提问来源于stack exchange,提问作者dmca
相关产品推荐
相关产品推荐

