Как вы можете вызвать вторую функцию при использовании лямбда-функции в вызове .apply () в Python? - PullRequest
0 голосов
/ 08 ноября 2019

Мне интересно, как преобразовать цикл 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 (), поэтому каждый заголовок сопоставляется с первым фильтрованным набором. Есть ли способ это исправить?

1 Ответ

0 голосов
/ 08 ноября 2019

Добро пожаловать в SO JP. Я вижу проблему в этой строке:

# Here's my attempt with a lambda function
df1['new_col'] = df1.title.apply(lambda x: Matcher(x, Filter(df1.year)))

вы вызываете Filter для всего столбца DataFrame year, в то время как в качестве решения для цикла вы хотите вызывать его только в год этой строки,поэтому я рекомендую использовать команду apply для таких строк:

df1['new_col'] = df1.apply(lambda row: Matcher(row.title, Filter(row.year)), axis=1)

Надеюсь, это поможет.

...