es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , , ,

Answer

  1. Avatar for 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:

    split_str = df2['Column1'].str.split(',')
    boolean_mask = split_str.apply(lambda x: df1['Column1'].isin(x).any())
    
    result = pd.DataFrame({'Column1': df1['Column1'], 'Column2': ['null' if not mask else ', '.join(df2.loc[mask, 'Column1']) for mask in boolean_mask]})
    

    Este código divide las cadenas en df2['Column1'] utilizando las comas como delimitador y almacena las listas resultantes en la variable split_str. Luego, se utiliza el método apply() para comprobar si alguno de los valores en df1['Column1'] existe en cada lista, creando una máscara booleana para cada fila.

    Finalmente, se crea un nuevo dataframe con Column1 de df1 y Column2 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 en df2['Column1'] con comas utilizando join() para crear el valor de esa fila.

    Este enfoque debería evitar la fusión no deseada de AC-2 y AC-20.

Comments are closed.