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

Pandas如何逐行提取DataFrame现有字段值生成新列

错误原因
  • 直接将整列Series对象传入%字符串格式化表达式时,不会逐行提取行值做拼接,只会将整个列的对象字符串表示插入模板,无法生成逐行匹配的结果
  • 原代码存在两处笔误:一是引用的字段名Level不存在,实际字段名为Levels;二是格式化传参的括号未闭合
正确实现方案

方案1:apply逐行处理(逻辑易读,适合小数据集)

指定axis=1按行遍历,逐行取字段值拼接SQL,代码如下:

import pandas as pd

data = {
  "Ticker": ['MSUSDSP5', 'MSUSSPVP', 'MSCBICC0'],
  "Levels": [50, 40, 45],
  "Pkey": [71763307, 5456454, 5454587],
  "Date": ['16Jun2022', '16Jun2022', '16Jun2022'],
}

df = pd.DataFrame(data)

df['sql_query'] = df.apply(
    lambda row: 'call CORE_VALUATIONS.VALUATIONS.INSERTEQCLOSINGPRICE(%s, %s, %s, NULL, NULL)' 
    % (row['Pkey'], row['Date'], row['Levels']),
    axis=1
)
print(df)

方案2:向量化拼接(性能更优,适合大数据集)

利用pandas字符串向量化操作,无需逐行循环,运行效率远高于apply:

df['sql_query'] = (
    'call CORE_VALUATIONS.VALUATIONS.INSERTEQCLOSINGPRICE(' 
    + df['Pkey'].astype(str) + ', ' 
    + df['Date'].astype(str) + ', ' 
    + df['Levels'].astype(str) 
    + ', NULL, NULL)'
)

也可以用列表推导式配合f-string实现,性能同样优秀:

df['sql_query'] = [
    f'call CORE_VALUATIONS.VALUATIONS.INSERTEQCLOSINGPRICE({pkey}, {date}, {level}, NULL, NULL)'
    for pkey, date, level in zip(df['Pkey'], df['Date'], df['Levels'])
]
预期输出效果

sql_query列逐行生成对应存储过程调用语句:

  • 第一行:call CORE_VALUATIONS.VALUATIONS.INSERTEQCLOSINGPRICE(71763307, 16Jun2022, 50, NULL, NULL)
  • 第二行:call CORE_VALUATIONS.VALUATIONS.INSERTEQCLOSINGPRICE(5456454, 16Jun2022, 40, NULL, NULL)
  • 第三行:call CORE_VALUATIONS.VALUATIONS.INSERTEQCLOSINGPRICE(5454587, 16Jun2022, 45, NULL, NULL)

生产环境直接执行拼接生成的SQL时,需做好特殊字符转义,规避SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:18:09