python pandas

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
eli
User
Beiträge: 6
Registriert: Mittwoch 28. September 2022, 15:01

Hallo,
Habe eine df der folgendermaßen aussieht:
typ_bw ... bez_str .... laenge_bw
bruecke ... Dorenerstraße .....17.0
bruecke .... Bregenzerwaldstraße .....35.0
tunnel .... Bregenzerwaldstraße .....5.0
.
.
.

und eine liste die alle straßen bezeichnungen (bez_str) enthält:
route = ["Bregenzerwaldstraße", "Faschinastraße"]

möchte jetzt die Gesamtlänge der route berechnen

Meine Idee war das mit einem for loop zu machen, allerdings funktioniert es bei mehreren Elementen in der Liste nicht mehr:

Code: Alles auswählen

    for element in route_1:
        bridge_distance_route_1 = df.loc[df['bez_str'] == element, 'laenge_bw'].sum()
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@eli: „Funktioniert nicht“ ist ja eigentlich immer eine recht dürftige Beschreibung des Problems. Was funktioniert denn nicht? Was erwartest Du als Ergebnis und was bekommst Du stattdessen? Oder bekommst Du gar eine Ausnahme? Dann solltest Du auch verraten welche. Am besten immer den Traceback 1:1 in den Beitrag kopieren.

Hier ist das Problem recht offensichtlich: Du bekommst immer das Ergebnis vom letzten Eintrag in `route_1`, denn die Schleife bindet sich bei jedem Durchlauf das aktuelle Ergebnis an einen Namen, der dann am Ende halt das Ergebnis vom letzten Durchlauf hat. Vielleicht möchtest Du vor der Schleife den Wert mit 0 initialisieren und die Teilergebnisse dann da drauf addieren. Besser wäre es aber das Pandas machen zu lassen. Also nicht jeden Abschnitt einzeln zu selektieren sondern vom Dataframe alle Abschnitte abzufragen und dann zu addieren. Also nicht ``== element`` sondern die entsprechende Methode die prüft ob `bez_str` in der Menge der Strassenbezeichner in der Route vorkommt.

Die `_1` an den Namen macht mir übrigens Sorgen. Die sollte da nicht stehen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
eli
User
Beiträge: 6
Registriert: Mittwoch 28. September 2022, 15:01

Code: Alles auswählen

def print_shorter_bridge_distance(df, route_1, route_2):

    for element in route_1:
        bridge_distance_route_1 = df.loc[df['bez_str'] == element, 'laenge_bw'].sum()

    for element in route_2:
        bridge_distance_route_2 = df.loc[df['bez_str'] == element, 'laenge_bw'].sum()
        
    print(bridge_distance_route_1, bridge_distance_route_2)

print_bridge_distance(df, ["Eichenberger Straße", "Faschinastraße"], ["Kennelbacher Straße", "Bregenzerwaldstraße", "Schollenstraße"])
geprintet wird : 0.0 0.0

eigentlich sollte die gesamt Länge der Routen, die aus mehreren Straßenteilen besteht, wobei die Straßenteile mehrmals vorkommen im df.

Bild
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@eli: Also grundsätzlich hat der Code das von mir beschriebene Problem, dass an die beiden Namen immer nur der Wert vom letzten Schleifendurchlauf gebunden wird.

Und was die 0en angeht, wäre die Frage wie denn die Definition von der `print_bridge_distance()`-Funktion aussieht. 🤔
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten