我有一个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
非常感谢帮助!
答案 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)