Pandas:用其他列值与变量替换DataFrame列内占位符的问题排查
问题根因
- 核心取值范围错误:
apply方法指定axis=1时,lambda的入参x就是当前遍历到的单行数据Series,但原代码替换占位符时,没有用x取当前行的对应值,反而直接引用了全局的df['payments']、df['pub']——这两个对象是DataFrame整列的Series,转成字符串后会自带行索引、换行符等格式化文本,不是单个单元格的数值。 - 因为每次替换用的都是同一个整列的文本内容,最终所有行的query替换后内容完全一致,还会带出整列字符串自带的开头索引0、换行截断的异常格式。
- 语法细节遗漏:原代码替换
secondvalue时,没有给日期值加SQL要求的单引号,即使取值正确,生成的SQL也无法正常执行。
正确实现方案
方案1:修正逐行apply的取值逻辑
把错误的整列取值替换为当前行单元格取值,同时补上SQL所需的字符串引号:
df['query'] = df.apply( lambda row: row['query'] .replace('firstvalue', str(row['payments'])) .replace('secondvalue', f"'{t2}'") .replace('thirdvalue', str(row['pub'])), axis=1 )
方案2:向量化字符串替换(大表优先选)
逐行apply在数据量较大时性能偏低,直接调用Pandas的字符串向量化方法,运行效率更高:
df['query'] = ( df['query'] # 逐列匹配替换,直接传入对应列的字符串值,不需要逐行遍历 .str.replace('firstvalue', df['payments'].astype(str), regex=False) .str.replace('secondvalue', f"'{t2}'", regex=False) .str.replace('thirdvalue', df['pub'].astype(str), regex=False) )
替换后效果验证:当行的payments为59495.17、pub为123时,生成的query完全符合预期:update table1 set Draft =59495.17, lastupdated=now() where StatsMonth = '2020-12-24' and Code =123。
内容的提问来源于stack exchange,提问作者Sarbjit
相关产品推荐
相关产品推荐

