Unir dos marcos de datos mediante la búsqueda y coincidencia exacta de las mismas cadenas.
Tengo dos dataframes de Python:
uno de ellos tiene una columna con una fila ‘AC-2’
otro dataframe incluye columnas que tienen una fila de cadena ‘AC-20,AC8,AC-15’
str_match = "({})".format("|".join(df1['columna_primer_dataframe']))
df2.merge(df2, how='left', left_on=df1['columna_primer_dataframe'].str.extract(str_match)[0], right_on="columna_segundo_dataframe")
Primer dataset:
Columna1 Columna2
AC-2 2<br>
AC-20 1<br>
AC-15 3<br>
AC-1 2<br>
AC-5 5
Segundo dataset:
Columna1<br>
AC-2,AC-5,AC-30<br>
AC-20,AC-30,AC11
Encontré:
Columna1 Columna2<br>
AC-2 AC-20,AC-30,AC11<br>
AC-2 AC-2,AC-5,AC-30<br>
AC-20 AC-20,AC-30,AC11<br>
AC-15 null<br>
AC-1 null<br>
AC-5 AC-2,AC-5,AC-30
arriba hay una coincidencia entre AC-2 para el dataset 1 y AC-20 en la cadena para el dataset 2, pero son cosas diferentes en mi dataset.
mi resultado deseado:
Columna1 Columna2<br>
AC-2 AC-2,AC-5,AC-30<br>
AC-20 AC-20,AC-30,AC11<br>
AC-15 null<br>
AC-1 null<br>
AC-5 AC-2,AC-5,AC-30
Intenté fusionar los dataframes buscando y emparejando PERO mi código fusionó AC-2 con AC-20. No quiero hacer eso.
¿Hay alguna forma de buscar y emparejar para fusionar mis dataframes exactamente como quiero? No quiero fusionar AC-20 y AC-2. Debe fusionar AC-2 y AC-2 con exactamente la misma cosa.
¡Gracias por sus contribuciones!
davy.ai
En lugar de utilizar coincidencia de cadenas con regex, puedes dividir las cadenas en el segundo dataframe y luego utilizar el método
isin()
para comprobar si los valores en la columna del primer dataframe existen en las cadenas divididas. Aquí tienes el código modificado:Este código divide las cadenas en
df2['Column1']
utilizando las comas como delimitador y almacena las listas resultantes en la variablesplit_str
. Luego, se utiliza el métodoapply()
para comprobar si alguno de los valores endf1['Column1']
existe en cada lista, creando una máscara booleana para cada fila.Finalmente, se crea un nuevo dataframe con
Column1
dedf1
yColumn2
creado en base a la máscara booleana. Si la máscara es False, se utiliza ‘null’ como valor para esa fila. Si la máscara es True, se concatenan las filas correspondientes endf2['Column1']
con comas utilizandojoin()
para crear el valor de esa fila.Este enfoque debería evitar la fusión no deseada de AC-2 y AC-20.