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?
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:
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:
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:
Ahora, la primera fila del dataframe fusionado mostrará la relación
0
como se espera: