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 dataframes de pandas por dos columnas sin importar el orden.

Tengo dos dataframes que se ven así:

net1

GeneA GeneB abs_dif log2FC omic
0 RBL2 ATOH7 0.277574 0.634319 trans
1 RBL2 USF2 0.276369 0.567421 trans
2 RBL2 RASA3 0.166101 0.474418 trans

net2

GeneA GeneB abs_dif log2FC omic
0 ATOH7 RBL2 0.277574 0.634319 meth
1 RBL2 USF2 0.276369 0.567421 meth
2 RBL2 Fernando 0.166101 0.474418 meth

Cada fila representa una relación. Estoy tratando de fusionar ambos dataframes de pandas en función de las columnas ‘GeneA’ y ‘GeneB’, manteniendo tanto las relaciones comunes como las no comunes. Lo estoy haciendo usando:

merged = pd.merge(net1, net2, how='outer', on=["GeneA", "GeneB"], indicator=True)

Lo cual devuelve:

GeneA GeneB abs_dif_x log2FC_x omic_x abs_dif_y log2FC_y omic_y merge
0 RBL2 ATOH7 0.277574 0.634319 trans nan nan nan left_only
1 RBL2 USF2 0.276369 0.567421 trans 0.276369 0.567421 meth both
2 ATOH7 RBL2 nan nan nan 0.277574 0.634319 meth right_only
3 RBL2 Fernando nan nan nan 0.166101 0.474418 meth right_only

Sin embargo, la relación 0 en ambas tablas es básicamente la misma, por lo que el orden de los elementos en las columnas GeneA y GeneB no debe considerarse en la fusión. Por lo tanto, la primera fila en el dataframe fusionado debería ser:

GeneA GeneB abs_dif_x log2FC_x omic_x abs_dif_y log2FC_y omic_y _merge
0 RBL2 ATOH7 0.277574 0.634319 trans 0.277574 0.634319 meth both

¿Cómo puedo fusionar los dataframes sin considerar el orden de los elementos en las dos columnas en las que se fusionan los dataframes?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para fusionar los dataframes sin tener en cuenta el orden de los elementos en las dos columnas, puedes crear una nueva columna en ambos dataframes que contenga tuplas ordenadas de los valores en las columnas ‘Gene_A’ y ‘Gene_B’.

    Puedes hacer esto utilizando el siguiente código:

    net1['gene_tuple'] = list(zip(net1['Gene_A'], net1['Gene_B']))
    net2['gene_tuple'] = list(zip(net2['Gene_A'], net2['Gene_B']))
    net1['gene_tuple'] = net1['gene_tuple'].apply(sorted).apply(tuple)
    net2['gene_tuple'] = net2['gene_tuple'].apply(sorted).apply(tuple)
    

    Este código crea una nueva columna ‘gene_tuple’ en ambos dataframes al combinar los valores de las columnas ‘Gene_A’ y ‘Gene_B’ en tuplas. Luego ordena las tuplas para asegurarse de que el orden de los elementos no importe y las convierte en tuplas hashable.

    Luego puedes fusionar los dataframes en la nueva columna ‘gene_tuple’, de la siguiente manera:

    merged = pd.merge(net1, net2, how='outer', on='gene_tuple', indicator=True)
    

    Esto fusionará los dataframes basándose en la nueva columna ‘gene_tuple’ en lugar de ‘Gene_A’ y ‘Gene_B’, teniendo en cuenta el orden de los elementos.

    Después de la fusión, puedes eliminar la columna ‘gene_tuple’ del dataframe fusionado si ya no la necesitas:

    merged.drop('gene_tuple', axis=1, inplace=True)
    

    Ahora, la primera fila del dataframe fusionado mostrará la relación 0 como se espera:

    Gene_A Gene_B abs_dif_x log2FC_x omic_x abs_dif_y log2FC_y omic_y _merge
    0 RBL2 ATOH7 0.277574 0.634319 trans 0.277574 0.634319 meth both

Comments are closed.