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.

Cómo obtener todas las combinaciones únicas de valores en una columna que están en otra columna.

Comenzando con un dataframe como este:

df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': ['a', 'b', 'b', 'b', 'a']})
   A  B
0  1  a
1  2  b
2  3  b
3  4  b
4  5  a

¿Cuál es la mejor manera de obtener un dataframe como este?

pd.DataFrame({'source': [1, 2, 2, 3], 'target': [5, 3, 4, 4]})
   source  target
0       1       5
1       2       3
2       2       4
3       3       4

Para cada vez que una fila en la columna A tiene el mismo valor en la columna B que otra fila en la columna A, quiero guardar las instancias únicas de esa relación en un nuevo dataframe.

Esto es lo más cerca que he llegado:

df.groupby('B')['A'].unique()
B
a       [1, 5]
b    [2, 3, 4]
Name: A, dtype: object

Pero idealmente quisiera convertirlo ahora en un solo dataframe y mi cerebro se ha bloqueado.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para convertir la salida anterior en un único dataframe con la salida deseada, puedes usar la función combinations del módulo itertools para generar pares únicos de columnas de origen y destino. El proceso implicará los siguientes pasos:

    1. Agrupa el dataframe original por la columna B y aplica la función unique a la columna A para obtener un objeto Series de pandas con los valores únicos de A para cada valor de B.
    grouped = df.groupby('B')['A'].unique()
    
    1. Convierte el objeto Series de pandas en un dataframe de pandas utilizando la función reset_index.
    grouped = grouped.reset_index()
    
    1. Usa la función combinations para generar pares únicos de columnas de origen y destino.
    from itertools import combinations
    
    edges = []
    for row in grouped.itertuples(index=False):
        for pair in combinations(row.A, 2):
            edges.append(pair)
    
    edges_df = pd.DataFrame(edges, columns=['source', 'target'])
    
    1. El dataframe resultante edges_df tendrá la salida deseada:
       source  target
    0       1       5
    1       2       3
    2       2       4
    3       3       4
    

Comments are closed.