Pandas: Как я могу повторить цикл for по двум различным фреймам данных?

Я пытаюсь рассчитать коэффициенты нечеткости для нескольких строк в двух фреймах данных:

df1:

id    name
1     Ab Cd E
2     X.Y!Z
3     fgh I

df2:

name_2
abcde
xyz

Я хочу рассчитать коэффициент нечеткости между всеми значениями в df1.name и df2.name_2:

Для этого у меня есть код:

for i in df1['name']:
    for r in df2['name_2']:
        print(fuzz.ratio(i,r))

Но я хочу, чтобы конечный результат также имел идентификаторы из df1. В идеале это выглядело бы так:

final_df:

id      name        name_2    score
1      Ab Cd E      abcde      50
1      Ab Cd E       xyz        0
2       X.Y!Z       abcde       0
2       X.Y!Z        xyz       60
3       fgh I       abcde       0
3       fgh I        xyz        0

Спасибо за помощь!


person Sravee    schedule 13.10.2017    source источник
comment
Вы можете попробовать что-то вроде этого: for i, r in zip(df1['name'], df2['name_2']): ... Это будет работать только для того, что вы хотите, если оба фрейма данных имеют одинаковую длину, но должно работать для вашего примера.   -  person L. MacKenzie    schedule 13.10.2017
comment
Спасибо! Но мой второй фрейм данных имеет только 2 строки по сравнению с первым, у которого есть 3.   -  person Sravee    schedule 13.10.2017
comment
@ L.MacKenzie дополнительно мне нужны идентификаторы из первого фрейма данных. Спасибо вам за помощь!   -  person Sravee    schedule 13.10.2017


Ответы (2)


Я не совсем понимаю применение лямбда-функций в pd.apply, но после некоторого поиска SO я думаю, что это разумное решение.

import pandas as pd
from fuzzywuzzy import fuzz

d = [{'id': 1, 'name': 'Ab Cd e'}, {'id': 2, 'name': 'X.Y!Z'}, {'id': 3, 'name': 'fgh I'}] 
df1 = pd.DataFrame(d)
df2 = pd.DataFrame({'name_2': ['abcde', 'xyz']})

Это перекрестное соединение в пандах; требуется tmp df панды перекрестно не соединяют общие столбцы

df1['tmp'] = 1
df2['tmp'] = 1

df = pd.merge(df1, df2, on=['tmp'])
df = df.drop('tmp', axis=1)

Вы можете .apply использовать функцию fuzz.ratio для столбцов в df. Pandas: как использовать функцию применения к нескольким столбцам

df['fuzz_ratio'] = df.apply(lambda row: fuzz.ratio(row['name'], row['name_2']), axis = 1)

df

Я также попытался установить индекс для df1, но это привело к его исключению из перекрестно соединенного df.

person Evan    schedule 13.10.2017

Решить проблему можно так:

Создайте пустой DataFrame:

final = pandas.DataFrame({'id': [], 'name': [], 'name_2': [], 'score': []})

Итерируйте по двум фреймам данных, вставляя идентификатор, имена и оценку и объединяя их в окончательный фрейм данных:

for id, name in zip(df1['id'], df1['name']):
    for name2 in df2['name_2']:
        tmp = pandas.DateFrame({'id': id, 'name': name, 'name_2': name2, 'score': fuzz.ratio(name, name2)})
    final = pandas.concat([final, tmp], ignore_index=True)

print(final)

Вероятно, есть более чистый и эффективный способ сделать это, но я надеюсь, что это поможет.

person L. MacKenzie    schedule 13.10.2017