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

将DataFrame列与标量列表相乘生成新列及性能警告处理

问题场景

现有如下DataFrame数据:

Date     Date.1 SYMBL   TF    Pattern  ...    Stop Risk Amount  GAP LVL  Actual / Back Test  Notes
0             00:00:00 2022-12-12  QCOM   5M  Buy Setup  ...  117.46        0.45      NaN              Actual    NaN
1  1900-01-01 00:00:00 2022-12-12  QCOM   5M       0.84  ...  117.46        0.45      NaN           Back Test    NaN
2  1900-01-02 00:00:00 2022-11-29  FUTU  15M  Buy Setup  ...   58.15        0.63      NaN              Actual    NaN

需求如下:

  • 将Risk Amount列与列表l=[2,3,4,5]中的每个标量相乘,生成对应名称的新列c2、c3、c4、c5(比如c2列值为Risk Amount*2)
  • 扩展需求:生成0.1到10之间的100个标量对应的新列,但循环逐个添加列时触发了性能警告:
PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
解决方案

核心思路是一次性生成所有需要的新列,再合并到原DataFrame,避免循环逐个添加导致的内存碎片化问题。

固定标量列表的实现

如果是针对l=[2,3,4,5]这类固定列表,代码如下:

import pandas as pd

# 假设原数据存在df中
scalars = [2, 3, 4, 5]
# 批量生成所有新列
new_columns = pd.DataFrame({
    f"c{num}": df["Risk Amount"] * num for num in scalars
})
# 一次性合并到原DataFrame
df = pd.concat([df, new_columns], axis=1)

100个连续标量的实现

针对0.1到10的100个标量,代码如下:

import numpy as np
import pandas as pd

# 生成0.1到10的100个均匀分布标量
steps = np.linspace(0.1, 10, 100)
# 批量生成新列,列名保留1位小数
new_columns = pd.DataFrame({
    f"c{step:.1f}": df["Risk Amount"] * step for step in steps
})
# 合并到原DataFrame
df = pd.concat([df, new_columns], axis=1)

补充处理

如果合并后仍存在内存碎片化提示,可执行以下语句重新生成连续内存的DataFrame:

df = df.copy()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:45:47