当你需要通过“自我”时使用应用功能作为参数

时间:2015-11-01 21:45:53

标签: python pandas dataframe apply

我有一个pandas数据框df,其中一列是'关键字'另一列是可能的关键字',因此前两行看起来如下:

df['keywords'][0] = 'traveling'
df['possible keywords'][0] = ['traveling', 'fishing','cooking']

df['keywords'][1] = 'fishing'
df['possible keywords'][0] = ['traveling', 'fishing','cooking']

我们假设df ['可能的关键字]系列中的每个元素都包含相同的列表,并且具有相同的元素([' travel',&#39 ;钓鱼''烹调'。])

我想要生成第三列,其中包含可能的关键字'那些不在'关键字'列,以便相应的行如下所示:

df['non keywords'][0] = ['fishing','cooking']
df['non keywords'][1] = ['traveling','cooking']

我能够使用以下代码完成此操作:

def establish(X):
    my_list = ['traveling', 'fishing','cooking']
    for element in my_list:
        if element in X:
            my_list.remove(element)
            return my_list

data['non keywords'] = data['keywords'].apply(establish)

但是,我必须在“'可能的关键字”列中包含该值。作为' my_list'在建立功能。

如何在“可能的关键字”中传递相同的价值'作为建立函数的参数?

以下是我到目前为止所遇到的问题:

建立功能的新版本:

def establish(my_list,X):
    for element in my_list:
        if element in X:
            my_list.remove(element)
            return my_list

my_list = ['traveling', 'fishing','cooking']
data['non keywords'] = data['keywords'].apply(establish(my_list))

Traceback (most recent call last):
  File "C:\Users\xxx\Anaconda3\lib\site-    packages\IPython\core\interactiveshell.py", line 3035, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-21-859ebaa71600>", line 1, in <module>
    data['non keywords'] = data['keywords'].apply(establish(my_list))
TypeError: establish() missing 1 required positional argument: 'X'

如果我改为尝试:

data['non keywords'] = data['keywords'].apply(establish(my_list,data['keywords']))

问题在于:

Traceback (most recent call last):
  File "C:\Users\xxx\Anaconda3\lib\site-    packages\IPython\core\interactiveshell.py", line 3035, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-22-ee891e061f5a>", line 1, in <module>
    data['non keywords'] =     data['original_keyword'].apply(establish(my_list,data['keywords']))
  File "C:\Users\xxxx\Anaconda3\lib\site-packages\pandas\core\series.py", line 2058, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas\src\inference.pyx", line 1046, in pandas.lib.map_infer    (pandas\lib.c:56983)
TypeError: 'NoneType' object is not callable

非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

apply()方法期望将函数或其他可调用函数作为参数,这正是您在传递establish时在第一个示例中传递的内容。在内部,pandas将您传递的函数与指定列的每个条目依次作为参数调用。

调用establish(my_list)将无法正常工作,因为您的函数现在需要2个参数。

致电establish(my_list,data['keywords'])是&#34;有效&#34;函数调用,但将返回None并为其第二个参数采用错误类型的参数,因为establish需要单个条目而不是列。一旦它返回None,那就是实际传递给apply()函数的内容,这显然是不可调用的,所以pandas会抛出。

一种解决方案是创建一个辅助功能,即&#34;预烘烤&#34;你的第一个参数,并将第二个参数作为唯一参数,然后用它调用establish()函数,这样你就可以将第二个函数传递给apply()方法。一个方便的方法是使用functools.partial

import functools
my_list = ['traveling', 'fishing','cooking']
helper_func = functools.partial(establish, my_list) # note that helper_func is an actual function that you can call
data['non keywords'] = data['keywords'].apply(helper_func)