Динамическая генерация имени объекта в столбце панды с использованием для l oop (нечеткая) - PullRequest
0 голосов
/ 04 мая 2020

навыки низкого уровня python здесь (обучение программированию с SAS).

Я пытаюсь применить ряд формул нечеткого совпадения строк (fuzzywuzzy lib) к парам строк, хранящимся в базовом кадре данных , Теперь я в конфликте о способе go об этом.

Должен ли я написать al oop, который создает специфицированный c кадр данных для каждой формулы, а затем добавить все эти субкадры в один? Проблема с этим подходом заключается в том, что, поскольку я не могу динамически называть субкадр, результирующее значение перезаписывается при каждом повороте l oop.

Или я должен создать один фрейм данных в одном oop, принимая названия и выражения моих формул как диктовку? Беда здесь дает мне ту же проблему, что и выше.

Вот мои формулы dict:

# ratios dict: all ratios names and functions
ratios = {"ratio": fuzz.ratio, 
          "partial ratio": fuzz.partial_ratio, 
          "token sort ratio": fuzz.token_sort_ratio, 
          "partial token sort ratio": fuzz.partial_token_sort_ratio,
          "token set ratio": fuzz.token_set_ratio,
          "partial token set ratio": fuzz.partial_token_set_ratio
          }

А вот l oop, который я сейчас потею:

# for loop iterating over ratios
for r, rn in ratios.items():

    # fuzzing function definition
    def do_the_fuzz(row):
        return rn(row[base_column], row[target_column])

    # new base df containing ratio data and calculations for current loop turn
    df_out1 = pd.DataFrame(data = df_out, columns = [base_column, target_column, 'mesure', 'valeur', 'drop'])
    df_out1['mesure'] = r
    df_out1['valeur'] = df_out.apply(do_the_fuzz, axis = 1)

Это дает мне ту же проблему, а именно то, что столбец 'mesure' перезаписывается, и я получаю столбец, полный последнего значения (здесь: 'частичный набор токенов').

Моя общая проблема заключается в том, что я не могу понять, могу ли я и как я могу динамически именовать кадры данных, столбцы или значения в python l oop (или если я даже должен это делать).

I ' Я слишком долго пытался найти решение, и я просто не могу его найти. Любое понимание будет очень ценится! Спасибо заранее!

1 Ответ

1 голос
/ 04 мая 2020

Я бы создал фрейм данных, который обновляется на каждой итерации l oop:

final_df = pd.DataFrame()
for r, rn in ratios.items():
    ...
    df_out1 = pd.DataFrame(data = df_out, columns = [base_column, target_column, 'mesure', 'valeur', 'drop'])
    df_out1['mesure'] = r
    df_out1['valeur'] = df_out.apply(do_the_fuzz, axis = 1)

    final_df = pd.concat([final_dfl, df_out1], axis=0)

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

...