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

循环生成的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]

问题原因

  1. 每次循环中ivxl_arr被反复重新赋值,没有保存历史数据,循环结束后仅保留最后一次的结果。
  2. 最后创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:57:43