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.

Intersección de múltiples conjuntos de forma iterativa.

Tengo un dataframe (pero también puede ser solo conjuntos/listas):

Grupo Letra
1 {a,b,c,d,e}
2 {b,c,d,e,f}
3 {b,c,d,f,g}
4 {a,b,c,f,g}
5 {a,c,d,e,h}

Quiero agregar una columna con la intersección de los grupos 1-2, 1-2-3, 1-2-3-4, 1-2-3-4-5. Así que quedará algo así:

Grupo Letra Intersección
1 {a,b,c,d,e} None
2 {b,c,d,e,f} {b,c,d,e}
3 {b,c,d,f,g} {b,c,d}
4 {a,b,c,f,g} {b,c}
5 {a,c,d,e,h} {c}

He leído acerca de np.intersect1d, set.intersection, así que puedo hacer una intersección de múltiples conjuntos. Pero no sé cómo hacerlo de manera inteligente. ¿Alguien puede ayudarme con este problema?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para agregar una columna con la intersección de los grupos 1-2, 1-2-3, 1-2-3-4 y 1-2-3-4-5 al marco de datos dado, uno puede usar un bucle for para iterar a través de cada fila del marco de datos y calcular la intersección en cada paso. A continuación se muestra un código de ejemplo que demuestra esta aproximación:

    import pandas as pd
    
    # crear el marco de datos
    df = pd.DataFrame({
        'Group': [1, 2, 3, 4, 5],
        'Letter': [{'a', 'b', 'c', 'd', 'e'}, {'b', 'c', 'd', 'e', 'f'}, 
                   {'b', 'c', 'd', 'f', 'g'}, {'a', 'b', 'c', 'f', 'g'}, 
                   {'a', 'c', 'd', 'e', 'h'}]
    })
    
    # definir la lista de grupos para calcular las intersecciones
    groups = [df['Letter'][:i].tolist() para i en rango(1, len(df)+1)]
    
    # calcular las intersecciones para cada fila
    intersections = []
    para i, fila en df.iterrows():
        intersección = set(fila['Letter'])
        para grupo en grupos:
            si set.intersection(*grupo[:i]):
                intersección = intersección.intersection(set.intersection(*grupo[:i]))
            más:
                intersección = None
                descanso
        intersections.append(intersección)
    
    # agregar la columna de intersección al marco de datos
    df['Intersection'] = intersections
    
    imprimir(df)
    

    Este código primero crea el marco de datos como se indica en la declaración del problema. Luego define una lista de grupos para calcular las intersecciones, donde cada grupo es el conjunto de letras hasta una cierta fila en el marco de datos.

    A continuación, el código itera a través de cada fila del marco de datos y calcula la intersección de las letras de esa fila con los grupos definidos anteriormente. En cada paso, el código verifica si la intersección de la fila actual con todas las filas anteriores en el grupo no está vacía. Si lo es, se agrega la intersección con la fila actual al conjunto de intersección en ejecución; de lo contrario, la intersección se establece en None y el bucle se rompe.

    Finalmente, el código agrega la columna de intersección al marco de datos y muestra el resultado. La salida debe coincidir con el resultado deseado:

       Group            Letter Intersection
    0      1  {a, b, c, d, e}         None
    1      2  {b, c, d, e, f}   {b, c, d, e}
    2      3  {b, c, d, f, g}      {b, c, d}
    3      4  {a, b, c, f, g}         {b, c}
    4      5  {a, c, d, e, h}          {c}
    

Comments are closed.