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

