У меня есть проблема, аналогичная ссылкам, приведенным в следующих ссылках, с небольшими отличиями, но я хочу получить такие же результаты:
У меня есть фрейм данных, и я хочу получить частичное соотношение и токен между двумя столбцами в фрейме данных. Столбец 1 — это всего лишь одно слово в строке, а столбец 2 — это список слов, каждая строка которого различается по размеру (я изменил его на кортеж, чтобы функции в ссылках работали).
Основная проблема, которую я получаю, заключается в том, что при сравнении он проходит через столбец 1 и сравнивает каждый элемент с каждым элементом в столбце 2, создавая массивный фрейм данных, когда я просто хочу, чтобы он был 1 к 1. Как я могу это исправить?
df = pd.DataFrame(
{
"id": [1, 2, 3, 4, 5, 6],
"fruits": ["apple", "apples", "orange", "apple tree", "oranges", "mango"],
"choices": [
("app", "apull", "apple"),
("app", "apull", "apple", "appple"),
("orange", "org"),
("apple"),
("oranges", "orang"),
("mango"),
],
}
)
id fruits choices
0 1 apple ('app', 'apull', 'apple')
1 2 apples ('app', 'apull', 'apple', 'appple')
2 3 orange ('orange', 'org')
3 4 apple tree ('apple')
4 5 oranges ('oranges', 'orang')
5 6 mango ('mango')
Что дает сравнение в проводнике переменных:
compare = pd.MultiIndex.from_product([df['fruits'], df['choices']]).to_series()
fruits choices
0 apple ('app', 'apull', 'apple')
1 apple ('app', 'apull', 'apple', 'appple')
2 apple ('orange', 'org')
3 apple ('apple')
4 apple ('oranges', 'orang')
5 apple ('mango')
6 apples ('app', 'apull', 'apple')
7 apples ('app', 'apull', 'apple', 'appple')
8 apples ('orange', 'org')
...
Можно ли получить желаемый результат, подобный первому результату в ссылке 1, но с мультииндексированными элементами в качестве вариантов?
Ожидаемый результат, как в ссылке № 1, но я хочу, чтобы варианты были мультииндексированы:
@Laurent, надеюсь, исправление прояснит любые вопросы
Вот один из способов сделать это с Pandas взорвать и groupby:
from fuzzywuzzy import fuzz
new_df = (
df.explode("choices")
.drop(columns = "id")
.pipe(
lambda df_: df_.assign(
ratio=df_.apply(lambda x: fuzz.ratio(x["fruits"], x["choices"]), axis=1),
token=df_.apply(
lambda x: fuzz.token_sort_ratio(x["fruits"], x["choices"]), axis=1
),
)
)
.groupby(["fruits", "choices"])
.agg(list)
.applymap(lambda x: x[0])
)
Затем:
print(new_df)
# Output
ratio token
fruits choices
apple app 75 75
apple 100 100
apull 60 60
apple tree apple 67 67
apples app 67 67
apple 91 91
appple 83 83
apull 55 55
mango mango 100 100
orange orange 100 100
org 67 67
oranges orang 83 83
oranges 100 100
Привет, не могли бы вы показать, как вы сравниваете значения и как должен выглядеть ожидаемый результат?