Ausgabe
Ich arbeite an einer Reihe von Mitarbeiterdaten, in denen alle Mitarbeiter einem Manager unterstellt sind. Im Datenrahmen werden alle Mitarbeiter als ID angezeigt und jede ID hat eine übergeordnete ID (die ID des Managers). Gibt es eine Möglichkeit zu überprüfen, ob die Berichtslinie eines Mitarbeiters direkt zu ihm selbst führt?
Beispieldatenrahmen:
pd.DataFrame({"id":[111,112,113],"parentid":[112,113,111]})
In diesem Beispiel berichtet Mitarbeiter 111 an 112, 112 berichtet an 113, 113 berichtet an 111. Die Zeile wird zu einem Zirkelbezug. Gibt es eine Möglichkeit, nach dieser Art von Zirkelverweis zu suchen?
Vielen Dank!
Lösung
Dies ist ein perfekter Anwendungsfall, um networkx
Ihre Daten als Diagramm zu betrachten.
Das ist dein Diagramm:
Erstellen Sie einen gerichteten Graphen und verwenden Sie ihn simple_cycles
, um die Zirkelbezüge zu identifizieren
import networkx as nx
G = nx.from_pandas_edgelist(df, source='parentid', target='id',
create_using=nx.DiGraph)
list(nx.simple_cycles(G))
Ausgang:[[112, 111, 113]]
Wenn Sie die kreisförmigen Knoten beschriften möchten, können Sie weiter verwenden:
circular = {n for l in nx.simple_cycles(G) for n in l}
df['circular'] = df['id'].isin(circular)
Ausgabe (in einem komplexeren Beispiel):
id parentid circular
0 111 112 True
1 112 113 True
2 113 111 True
3 210 211 False
4 211 212 False
Beantwortet von – mozway
Antwort geprüft von – Dawn Plyler (FixError Volunteer)