Actualmente estoy empezando a entrar en pandas y me preguntaba, si hay una función darme categorías comunes de los elementos de una trama de datos. Visualizar:
Estos son los datos que he (altamente ejemplo simplificado, obviamente)
Discipline Person
0 football Alanis
1 football Bernard
2 football Delilah
3 basketball Charlie
4 basketball Delilah
5 tennis Charlie
Y me gustaría saber, que dos personas comparten una disciplina, idealmente en forma de una matriz de este modo:
Alanis Bernard Charlie Delilah
Alanis True True False True
Bernard True True False True
Charlie False False True True
Delilah True True True True
Alternativamente, podría ser una función que devuelve una lista de categorías comunes.
Ni siquiera sé si los pandas es la mejor herramienta para una tarea como ésta (probablemente no), como ya he dicho, estoy todavía un novato. Yo aprecio su ayuda sin embargo. ¡Gracias!
Un enfoque podría ser la construcción de una red, y obtener de él la matriz de adyacencia :
import networkx as nx
from itertools import combinations, chain
L = df.groupby('Discipline').Person.agg(list)
G = nx.Graph()
L = [list(combinations(i,2)) for i in L.values.tolist()]
G.add_edges_from(chain.from_iterable(L))
nx.to_pandas_adjacency(G, nodelist=sorted(G.nodes())).astype(bool)
Alanis Bernard Charlie Delilah
Alanis False True False True
Bernard True False False True
Charlie False False False True
Delilah True True True False
Si desea que los valores diagonales se establece en True, sólo podría añadir:
import numpy as np
out[:] = out.values + np.eye(out.shape[1], dtype=bool)
print(out)
Alanis Bernard Charlie Delilah
Alanis True True False True
Bernard True True False True
Charlie False False True True
Delilah True True True True