Usando rapidfuzz en un dataframe
Tengo 4 columnas que son BuisnessID, Nombre, BuisnessIDy, Nombrey y quiero hacer coincidir Nombre con Nombre_y con un puntaje de similitud del 90%, y si no es del 90% entonces eliminar esas filas. Entrada de ejemplo:
df
BusinessID NAME BusinessID<em>y NAME</em>y
<p>1013120869 MANOJ WANKHADE 1013404164 SLIMI
1013120869 MANOJ WANKHADE 1013831688 AMOL SHAHAKAR
1013120869 MANOJ WANKHADE 1013376009 PRATHMESH AGRAWAL
1013120869 MANOJ WANKHADE 1013376009 PRATHMESH AGRAWAL
1013120869 MANOJ WANKHADE 1013478922 AMBRISH PANDRIKAR
Soy nuevo en Python y no estoy seguro de cómo hacer esto. Además, tengo 500k registros, así que cualquier otro enfoque aparte de rapid-fuzz sería genial.
davy.ai
Coincidencia de nombres con rapidfuzz
Para hacer coincidir los nombres en las columnas ‘Name’ y ‘BuisnessID’ con una puntuación de similitud del 90%, puedes utilizar la función
process.extract
del paqueterapidfuzz
.Aquí tienes cómo hacerlo:
Esto producirá la siguiente salida:
Ten en cuenta que primero definimos una función
match_names
que utiliza la funcióntoken_sort_ratio
derapidfuzz
para calcular la puntuación de similitud entre dos nombres. Luego aplicamos esta función a las columnas ‘Name’ y ‘Name_y’ utilizando el métodoapply
. Finalmente, eliminamos las filas donde el puntaje de coincidencia es inferior al 90% utilizando la técnica de indexación booleana.Coincidencia de nombres con otros enfoques
Si no quieres utilizar
rapidfuzz
, tienes otros enfoques para hacer coincidir nombres que puedes usar. Uno de estos enfoques es la distancia Jaro-Winkler, que es una medida de similitud entre dos cadenas donde la puntuación es mayor si las cadenas tienen un mayor número de prefijos coincidentes. Puedes utilizar el paquetejellyfish
para calcular la distancia Jaro-Winkler en Python.Aquí tienes cómo hacerlo:
Esto producirá la misma salida que antes, pero utilizando un enfoque diferente para la coincidencia de nombres. Puedes experimentar con diferentes medidas de similitud y umbrales para ver cuál funciona mejor para tus datos.