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

Python Pandas replace()无法按行替换#CRNCY#问题求助

解决Pandas替换DataFrame中#CRNCY#为对应行CRNCY列值的问题

你的核心需求是逐行将DataFrame所有列中的#CRNCY#替换为该行CRNCY列的对应值,之前的replace()写法无效,是因为Pandas默认的replace()逻辑不支持直接用Series按行匹配替换——它会把Series当成值映射字典,而非逐行对应的替换值。

有效解决方案

方法1:全列批量替换(逐行处理)

使用apply(axis=1)逐行遍历,对每行的每个元素做判断替换:

import pandas as pd

# 逐行处理,替换所有列中的#CRNCY#
test = test.apply(lambda row: row.apply(lambda x: row['CRNCY'] if x == '#CRNCY#' else x), axis=1)

方法2:指定列替换(更高效)

如果只有部分列(比如示例中的SCD_CUR)需要替换,可针对性处理,避免全列遍历:

# 仅替换SCD_CUR列中的#CRNCY#
test['SCD_CUR'] = test.apply(lambda row: row['CRNCY'] if row['SCD_CUR'] == '#CRNCY#' else row['SCD_CUR'], axis=1)

方法3:排除CRNCY列的全列替换

如果不想修改CRNCY列本身,可以先筛选出需要替换的列再处理:

# 排除CRNCY列,处理其他所有列
cols_to_replace = test.columns.drop('CRNCY')
test[cols_to_replace] = test.apply(lambda row: row[cols_to_replace].replace('#CRNCY#', row['CRNCY']), axis=1)

为什么之前的写法无效?

你尝试的test.replace("#CRNCY#", test['CRNCY'], regex=True)这类写法,Pandas会把test['CRNCY']这个Series转换成值映射字典(比如把USD、EUR作为键和值),而非逐行对应替换。这种逻辑是把所有#CRNCY#替换成固定的字典值,而非每行的CRNCY值,所以达不到预期效果。

注意事项

如果CRNCY列存在缺失值(NaN),替换后对应的#CRNCY#会变成NaN。若需要避免这种情况,可以添加非空判断:

test = test.apply(lambda row: row.apply(lambda x: row['CRNCY'] if pd.notna(row['CRNCY']) and x == '#CRNCY#' else x), axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:10:33