将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
相关产品推荐
相关产品推荐

