2015-11-01 1 views
1

У меня есть pandas dataframe df, где один столбец - это «ключевые слова», а другой столбец - «возможные ключевые слова», так что первые две строки выглядят следующим образом:использование функции apply, когда вам нужно передать «self» в качестве аргумента

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

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

предположим, что каждый элемент в ФР [ «возможные ключевые слова»] серия содержит тот же список, с теми же элементами ([ «путешествия», «рыбалка», «Cooking»]).

Я хочу, чтобы создать третий столбец, где я включаю «возможные ключевые слова», которые не в столбце «Ключевое слово», так что соответствующие строки выглядят следующим образом:

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

Метод apply() ожидает как аргумент функции или другого вызываемого, что именно вы проходите в первом примере, когда вы проходите establish. Внутри pandas вызывает функцию, которую вы передаете, с каждой записью указанного столбца в свою очередь в качестве аргумента.

Вызов establish(my_list) будет работать неправильно, потому что ваша функция теперь принимает 2 аргумента.

Вызов establish(my_list,data['keywords']) является «действительным» вызов функции, но будет возвращать None и принимает неправильный тип аргумента для второго параметра кроме того, потому что establish ожидает одну запись, а не столбец. Как только он возвращает None, это то, что фактически передается функции apply(), что, очевидно, не подлежит вызову, и поэтому панды подбрасываются.

Одним из решений является создание вспомогательной функции, которая «предварительно испекает» ваш первый аргумент и принимает второй аргумент как единственный аргумент, а затем вызывает с ним функцию 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) 
+0

привет, спасибо большое за ответ. Я пробовал ваш подход, но результат заключается в том, что «Ни один» не входит в каждую запись данных ['non keywods'] –

+0

hmm .. Я просто попробовал это с вашим примером и получил ['cooking'] для обеих строк 'non keywords' ,Проблема в том, что ваш метод 'install()' сохраняет модификацию одного и того же списка на месте (в вашем случае это произойдет, если функция set возвращает 'None' независимо от ввода). Попробуйте изменить метод 'set()', чтобы сделать что-то вроде 'return [elem for elem in my_list if elem! = X]' или по крайней мере обязательно скопировать 'my_list' вместо редактирования на месте. Надеюсь, что помогает – lemonhead

+0

привет, спасибо большое lemonhead, синтаксис, который вы предложили, работал красиво: def установить (x, my_list): return [elem for elem in my_list if elem not in x]. Кроме того, я мог бы использовать данные ['keywords']. Apply (установить, args = (my_list,)) - я считаю, что он работает в новой версии pandas - в качестве альтернативы использованию functools –

Смежные вопросы