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

如何在Pandas apply中向自定义normalize函数传递delimiters参数?

解决方案:将分隔符作为参数传入标准化函数

问题说明

需要将DataFrame指定列中的多种分隔符(/、;、,等)统一替换为|,同时要把可变的delimiters作为参数传入normalize函数,原代码存在变量名错误、替换逻辑不完整的问题,需一并修正。

原代码问题点

  • 变量名错误:text未定义(应为column_text),normalized未定义(应为normalized_column_text)
  • 替换逻辑缺陷:循环中只要第一次替换就返回,会漏掉后续分隔符的替换
  • delimiters为全局变量,无法根据条件动态传入

修正后的实现方案

方式一:使用lambda传递参数

通过lambda匿名函数在apply时直接将delimiters传入normalize函数,同时优化替换逻辑为正则一次性匹配所有分隔符:

import re
import pandas as pd

# 示例DataFrame
df = pd.DataFrame({
    'name': ['a/b/c', 'd;e,f', 'g'],
    'sex': ['M/F', 'F;M', 'M'],
    'age': [20, 30, 25]
})

columns_to_be_normalized = ['name', 'sex']
delimiters = ['/', ';', ',']      

def normalize(column_text, delimiters):
    # 构建正则模式,转义特殊字符避免匹配错误
    pattern = '|'.join(re.escape(d) for d in delimiters)
    return re.sub(pattern, '|', column_text)

# 遍历列并应用标准化函数
for column in columns_to_be_normalized:
    df[column] = df[column].apply(lambda x: normalize(x, delimiters))

print(df)

方式二:使用functools.partial绑定参数

如果需要多次复用绑定了指定delimiters的标准化函数,可以用partial预先绑定参数:

import re
import pandas as pd
from functools import partial

# 示例DataFrame
df = pd.DataFrame({
    'name': ['a/b/c', 'd;e,f', 'g'],
    'sex': ['M/F', 'F;M', 'M'],
    'age': [20, 30, 25]
})

columns_to_be_normalized = ['name', 'sex']
delimiters = ['/', ';', ',']      

def normalize(delimiters, column_text):
    pattern = '|'.join(re.escape(d) for d in delimiters)
    return re.sub(pattern, '|', column_text)

# 预先绑定delimiters参数,生成新的标准化函数
normalizer = partial(normalize, delimiters)

# 应用到目标列
for column in columns_to_be_normalized:
    df[column] = df[column].apply(normalizer)

print(df)

关键优化点

  • 正则一次性替换所有目标分隔符,避免循环替换的遗漏问题,同时提升效率
  • 将delimiters作为函数参数传入,支持根据不同条件动态调整分隔符列表
  • 修正了原代码中的变量名错误,保证代码可正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:21:00