循环生成的ivxl_arr数组被覆盖,无法批量存入新DataFrame求助
问题描述
我需要解析DataFrame,从其子集中生成列表并转为数组,再将每次循环生成的ivxl_arr数组副本存入新DataFrame(newdf)的不同列。但目前ivxl_arr会被循环反复覆盖,虽然循环内打印数据正确,但最终newdf只存入了最后一个数组,而非全部m个数组。
原代码
for m in range(len(mats)): xx_ = [] #list to feed into an array for further treatment later in my code delt_ = [] #list to feed into an array for further treatment later in my code for i in range(len(df)): if df['Maturity'][i] == mats[m]: d = df['IVX'][i] xx_.append(d) di = df['raw_dlt'][i] delt_.append(di) ivxl_arr = np.asarray(xx_) delta_arr = np.asarray(delt_) print(ivxl_arr) newdf = pd.DataFrame(ivol_arr)
预期存入newdf的数组(各对应一列)
- [84.5306 83.6606 82.8445 82.1378 81.5821 80.6491 79.8861 78.9784 79.0328]
- [77.8581 75.4054 73.6177 72.3086 71.2534 70.1216 68.8867 67.3913 63.5827]
- [65.8867 62.7784 60.1962 57.9742 56.2001 54.9078 52.6097 50.806 47.3156]
- [62.0567 57.322 54.918 52.9547 51.4354 49.6318 48.0504 45.1384 42.5164]
问题原因
- 每次循环中
ivxl_arr被反复重新赋值,没有保存历史数据,循环结束后仅保留最后一次的结果。 - 最后创建
newdf时只传入了最后一个数组,因此最终DataFrame只有一列。
解决方案
方案1:收集所有数组后构建DataFrame
在循环外初始化列表,每次循环将生成的ivxl_arr添加到列表中,最后用列表创建DataFrame,每个数组对应一列:
import numpy as np import pandas as pd # 初始化列表存储所有ivxl数组 ivxl_list = [] delta_list = [] for m in range(len(mats)): xx_ = [] delt_ = [] for i in range(len(df)): if df['Maturity'][i] == mats[m]: xx_.append(df['IVX'][i]) delt_.append(df['raw_dlt'][i]) # 遍历完当前Maturity的所有行后再转数组,避免重复赋值 ivxl_arr = np.asarray(xx_) delta_arr = np.asarray(delt_) ivxl_list.append(ivxl_arr) delta_list.append(delta_arr) print(f"Maturity {mats[m]} 的ivxl数组: {ivxl_arr}") # 将列表转为DataFrame,每个元素对应一列 newdf = pd.DataFrame(np.column_stack(ivxl_list)) # 可选:给列命名对应Maturity值 newdf.columns = [f"Maturity_{mat}" for mat in mats]
方案2:用pandas分组功能简化代码
原代码的嵌套循环效率较低,直接使用groupby按Maturity分组,提取数据后构建DataFrame更高效:
import pandas as pd import numpy as np # 按Maturity分组提取IVX列,转为数组列表(保持mats顺序) ivxl_list = [df[df['Maturity'] == mat]['IVX'].to_numpy() for mat in mats] # 构建DataFrame,每个数组对应一列 newdf = pd.DataFrame(np.column_stack(ivxl_list)) newdf.columns = [f"Maturity_{mat}" for mat in mats]
内容的提问来源于stack exchange,提问作者gt89
相关产品推荐
相关产品推荐

