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.

Encontrar la intersección entre dos dataframes de forma iterativa.

Tengo los siguientes dos dataframes y me gustaría encontrar su intersección.

df1 = pd.DataFrame({"0": [1524, 8788, 9899, 27172],
                   "1": [1333, 4476, 78783, 90832],
                   "2": [2021, 2022, 34522, 38479]})

print(df1)

      0      1      2
0   1524   1333   2021
1   8788   4476   2022
2   9899  78783  34522
3  27172  90832  38479

df2 es de tipo lista con una columna ‘0’ que se ve así:

          0
[1123, 2021, 1333, 6636], 
[1245, 2022, 4477, 0], 
[1524, 2023, 1, 27172], 
[2021, 2023, 90832, 38479]

La salida esperada debería ser la intersección de df1 y df2, por ejemplo:

df3 = [2021, 1333],
      [2022],
      [0],
      [90832, 38479]

Lo que he leído hasta ahora se refiere a encontrar la intersección para una sola lista, y no para dos dataframes con diferentes tipos de datos. Mi objetivo final es calcular la precisión que es la intersección de df1 y df2 dividida por el número total de mis recomendaciones de df1, que es 3.
Nota adicional de los comentarios debajo:
Las filas están alineadas y se compararían de a pares.
[0] en df3 no aparece en ninguna parte, pero podría funcionar en caso de que la intersección sea 0.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para encontrar la intersección de df1 y df2, podemos convertir df2 en un conjunto de tuplas y realizar la intersección de conjuntos con cada fila de df1 como una tupla. Aquí está el código para lograr eso:

    df2_set = set(map(tuple, df2))
    df3 = []
    for i in range(len(df1)):
        row_set = set(df1.iloc[i])
        intersection_set = row_set.intersection(df2_set)
        intersection_list = list(intersection_set)
        df3.append(intersection_list)
    

    En el código anterior, primero convertimos df2 en un conjunto de tuplas usando la función map y el constructor tuple. Esto es necesario porque los conjuntos solo pueden contener tipos hashables, y las listas no son hashables.

    A continuación, iteramos sobre todas las filas de df1 utilizando un bucle for. Para cada fila, la convertimos en un conjunto y realizamos la intersección de conjuntos con df2_set. Luego convertimos el conjunto resultante nuevamente en una lista y la agregamos a df3.

    El resultado final es una lista de listas que contiene la intersección de cada fila de df1 con df2. Tenga en cuenta que si la intersección está vacía, se agrega una lista con un único elemento (0 en este caso) a df3.

    Para calcular la precisión, podemos contar el número de listas no vacías en df3 y dividirlo por el número total de recomendaciones, que en este caso es 3. Aquí está el código:

    num_nonempty_lists = sum([bool(lst) for lst in df3])
    precision = num_nonempty_lists / 3
    

    La función sum se utiliza para contar el número de valores True en la comprensión de lista, lo que da el número de listas no vacías. Luego dividimos por 3 para obtener la precisión.

Comments are closed.