初学者:TypeError:<lambda>()得到了意外的关键字参数'func_names'

时间:2019-12-04 19:04:07

标签: python-3.x pandas scikit-learn spacy sklearn-pandas

df ['Pattern'] = df ['phrases']。apply(lambda texte:Preprocess,func_names = ['tokenizeTexte_0'])

import TreeTagger OK
Traceback (most recent call last):
  File "classifier.py", line 41, in <module>
    df['Pattern'] = df['phrases'].apply(lambda texte:Preprocess, func_names=['tokenizeTexte_0']) # modify the parameter each time you want to change the preprocess steps
  File "/home/ke/anaconda3/lib/python3.7/site-packages/pandas/core/series.py", line 3194, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas/_libs/src/inference.pyx", line 1472, in pandas._libs.lib.map_infer
  File "/home/k/anaconda3/lib/python3.7/site-packages/pandas/core/series.py", line 3181, in <lambda>
    f = lambda x: func(x, *args, **kwds)
TypeError: <lambda>() got an unexpected keyword argument 'func_names'

文件看起来像这样(这是一个示例,因为,我无法放置原始数据)

id    phrases                       etiquette    sous-classe
23    C'est un psychiatre canadien.  Med          p
56    le Pr. Moldofsky, qui a fait   Med          n
émerger en 1975 cette maladie, 
45    en identifiant des plaintes    Fed          ne
78équivalentes par privation de sommeil 
chez des patientes volontaires. 
789    Reconnue Outre-Atlantique,    Ged          p
elle reste peu connue dans l'Hexagone. 

2 个答案:

答案 0 :(得分:1)

这似乎是您没有正确理解apply函数。 在apply中,您只需传递函数名称而无需使用括号,pandas会根据lambda适当地将参数发送给函数。

所以做错了

df['Pattern'] = df.apply(lambda row:Preprocess(row['phrases'], tokenizeTexte_0),...)

您只需要这样做:

df['Pattern'] = df.apply(lambda x:Preprocess ,...)

现在,您只想在"phrases"上工作。因此,无需在整个数据帧上使用.apply。您可以使用:

df['Pattern'] = df['phrases'].apply(lambda texte:Preprocess, ...)

第二,您的Preprocess函数需要第二个参数"func_names"作为列表。您可以在应用程序中传递(而不是在预处理中),就像这样:

更正

df['Pattern'] = df['phrases'].apply(Preprocess, 
                                    func_names=['tokenizeTexte_0'])

答案 1 :(得分:0)

执行此操作的通用方法是将函数存储在字典中,在其中您可以使用键找到所需的函数。下面是一个示例,其中我创建一个函数combine_functions,该函数将字符串列表作为参数。这使您可以选择应按哪个顺序运行哪个功能。从技术上讲,这还允许您多次运行相同的功能。

def func1(x):

    print("I am func1")

    return x


def func2(x):

    print("I am func2")

    return x


def func3(x):

    print("I am func3")

    return x


def combine_functions(x, func_names=[]):

    functions = {"func1": func1,
                 "func2": func2,
                 "func3": func3}

    for func_name in func_names:

        x = functions[func_name](x)

    return x