我正在使用python构建地址解析工具来标记地址部分。我有一个看起来像这样的pandas数据框。
df = pd.DataFrame({"TOKEN": ['123.', 'Fake', 'street']})
我有很多功能如下:
def f_ends_in_period(s):
return 'f_ends_in_period' if s[-1] == "." else ''
def f_numeric(s):
return 'f_numeric' if any([k.isdigit() for k in s]) else ''
def f_capitalized(s):
return 'f_capitalized' if s[0].isupper() else ''
...
特征功能相当严格。如果字符串f_blah(s)
满足某些条件(即条件“blah”),则特征函数s
返回“f_blah”,否则返回空字符串。这有点奇怪,但有一种疯狂的方法。
无论如何,现在我正在做的只是在列表中
df['f_ends_in_period'] = df['TOKEN'].apply(f_ends_in_period)
df['f_numeric'] = df['TOKEN'].apply(f_numeric)
df['f_capitalized'] = df['TOKEN'].apply(f_capitalized)
这很好用,除了每次我想创建一个新的特征函数时,我必须至少输入该特征函数的名称4次。这开始变得非常烦人,特别是如果我想要创建许多功能。
我可以使用哪种标准模式来重构这个模式吗?我不确定解决方案的确切含义,我只是在寻找简化此流程的建议。
答案 0 :(得分:0)
您可能对这段代码感兴趣
from inspect import getmembers, isfunction
import my_module
functions_list = [o for o in getmembers(my_module) if isfunction(o[1])]
它返回一个元组列表,其中包含模块中的所有函数以及它们的名称作为字符串。
答案 1 :(得分:0)
pythonic解决方案是使用函数列表,然后使用理解来构建结果列表。这是一个可以让你顺利的例子:
def f_ends_in_period(s):
return 'f_ends_in_period' if s[-1] == "." else ''
def f_numeric(s):
return 'f_numeric' if any([k.isdigit() for k in s]) else ''
funcs = [f_ends_in_period, f_numeric]
result = [f(s) for f in funcs]
您只需添加一次方法或函数,然后将其添加到func列表定义中。
编辑:您可以将Elmex80s的答案与我的相结合,从而以编程方式构建功能列表,甚至可以通过按功能名称进行过滤。例如,获取名称以“validate_”开头的所有成员函数,然后使用上面的te代码遍历该列表。