Tenho um conjunto de dados que contém 3 colunas. Essas são conexões de aresta entre nós e a força da conexão. O que estou tentando fazer é encontrar e mesclar as arestas extras que podem ocorrer quando a direção vai na direção oposta.
como um pequeno exemplo
data_frame = pd.DataFrame({"A":["aa", "aa", "aa", "bb", "bb", "cc", "dd", "dd"],
"B":["bb", "cc", "dd", "aa", "dd", "aa", "ee", "aa"],
"C":[4,3,4,5,3,4,2, 5]})
o gráfico de nós resultante
aa - bb
| \ |
cc dd -- ee
Dos nós, temos sobreposição, pois "aa - bb" é o mesmo que "bb - aa" e o mesmo com "aa - dd" e "dd - aa"
Pensei em mesclar A e B, tanto para frente quanto para trás, concatenar os dois dataframes e então executar a, group_by().sum()
mas acabei com extras que precisam ser removidos depois.
o ideal seria que funcionasse assim
A | B | C A | B | C
aa bb 4 aa bb 9
aa cc 3 aa cc 7
aa dd 4 aa dd 9
bb aa 5 bb dd 3
bb dd 3 --> dd ee 2
cc aa 4
dd ee 2
dd aa 5
Você pode agregar como
frozenset
e então executar umgroupby.sum
:Saída:
Variante para obter as colunas originais:
Saída:
Como a conversão para
frozenset
é bem lenta, você também pode colocarsort
os valores em uma ordem consistente usando numpy , egroupby.sum
:Variante do método semelhante sugerido por @PandaKim, com eficiência melhorada:
Saída:
horários:
Uma possível solução, cujos passos são:
Primeiro, ele usa
assign
para criar novas colunasA
eB
calcular os valores mínimo e máximo nas colunas originaisA
paraB
cada linhadf
é então agrupado por essas novas colunasA
e usando , e a soma da coluna é calculada para cada grupo.B
groupby
C
Saída:
Código
Quanto ao agrupamento em qualquer ordem, tentei algumas maneiras diferentes, mas me sinto mais confortável usando grouper com
np.sort
o resultado de como uma lista.