Beginner: TypeError: <lambda>() got an unexpected keyword argument 'func_names'

Beginner: TypeError: <lambda>() got an unexpected keyword argument 'func_names'

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. 

执行此操作的通用方法是将函数存储在字典中,您可以在其中使用键查找所需的函数。下面是一个示例,其中我创建了一个函数 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

这似乎是您没有正确理解 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'])