Мне интересно, как преобразовать цикл for в метод .apply () в Pandas. Я пытаюсь перебрать один столбец кадра данных (df1) и вернуть совпадения из подмножеств второго кадра данных (df2). У меня есть функция для сопоставления (Matching), а также функция для выбора нужного поднабора из df2 (Filter). Я хочу знать, возможно ли использовать метод .apply () Pandas для вызова обеих функций.
Я разработал, как сделать это как цикл for (см. Ниже), и кажется, что яМожно сделать это с помощью понимания списка, сначала создав полную функцию (см. здесь ), но у меня возникают проблемы при использовании метода Pandas .apply () и лямбда-выражения.
## Here is my Filter, which selects titles from df2 for one year
## either side of a target year
def Filter (year):
years = [year-1, year, year+1]
return df2[df2.year.isin(years)].title
# Here is my matching routine, it uses the process method from
# fuzzywuzzy
def Matcher(title, choices):
title_match, percent_match, match3 = process.extractOne(title,
choices, scorer=fuzz.token_sort_ratio)
return title_match
# Here is my solution using a for-loop
for index, row in df1.iterrows():
targets = Filter(row.year)
df1.loc[index,'return_match'] = Matcher(row.title, targets)
# Here's my attempt with a lambda function
df1['new_col'] = df1.title.apply(lambda x: Matcher(x,
Filter(df1.year)))
Когда я использую лямбда-функцию, то, по-видимому, происходит то, что функция Filter вызывается только на самой первой итерации метода .apply (), поэтому каждый заголовок сопоставляется с первым фильтрованным набором. Есть ли способ это исправить?