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

