DataFrame filtern mit .contains?

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
aqualx
User
Beiträge: 7
Registriert: Donnerstag 9. April 2020, 19:54

Hallo zusammen,

ich habe ein sehr großes DataFrame mit verschiedenen Informationen unterschiedlicher Standorte in ganz Deutschland.
Ich versuche nun die Daten aus df_daten aus den Regionen, die im DataFrame df_orte hinterlegt sind, einzugrenzen.

Das Dataframe hat eine Spalte "Standorte" mit PLZ+Ort+Straße.

Leider funktioniert es nicht wirklich. Getestet habe ich es mit einem kleineren Dataframe - selbst bei dem es verhältnismäßig lange gedauert und nicht das gewünschte Ergebnis geliefert hat.

Code: Alles auswählen

# df_daten hat etwa 2 Millionen Zeilen
# df_orte hat etwa 150 Zeilen

for i in range( 0,len(df_daten) ):
    for Ortwahl in range( 0,len(df_orte ) ):
        df_Daten_pos = df_daten[df_daten['Standort'].str.contains(df_orte.plz[Ortwahl], case=True, na=False)].index.tolist() 
    print ("Process: " + str(round((i+1)/len(df_test)*100,2)) + " %")
danach würde ich gerne mit Hilfe der Indexpositionen aus df_Daten_pos die eingegrenzten Daten in ein DataFrame speichern

Code: Alles auswählen

df_Daten_eingegrenzt = pd.DataFrame(df_Daten.iloc[df_Daten_pos])
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man eine Schleife schreibt, macht man mit Pandas normalerweise etwas falsch, wenn man dann eine Schleife über einen Index schreibt, garantiert.
def_Daten_pos ist kein Dataframe, sondern eine Liste, mit der dann nichts gemacht wird. Strings stückelt man nicht mit + zusammen, und zum Runden benutzt man auch Stringformatierung:

Code: Alles auswählen

print(f"Process: {(i+1)/len(df_test):.2%}")
Dann habe ich noch nicht verstanden, was Du eigentlich machen willst. Kannst Du mal Beispieldaten zeigen und was das Ergebnis sein soll?
aqualx
User
Beiträge: 7
Registriert: Donnerstag 9. April 2020, 19:54

Hier ein Bildausschnitt des DataFrames "df_daten": https://ibb.co/gPjxq0K

In df_daten sind Erzeugungsanlagen aus ganz Deutschland aufgelistet - mich interessieren aber nur die aus einer bestimmten Region.

ich möchste die Zeilen in df_daten herausfiltern, die in der Spalte "Standort" bestimmte Postleitzahlen (aus df_orte) haben und in ein neues DataFrame speichern.
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

Das ist eine ungünstige Datenstruktur. Lege zwei DataFrames an, die jeweils über eine Spalte "Postleitzahl" verfügen. Dann kannst Du data gegen orte mergen und erhältst einen neuen DataFrame mit der gewünschten Selektion.
Aber vielleicht musst Du dafür Deine Rohdaten zunächst bearbeiten. Dann kannst Du möglicherweise dort schon filtern – ohne pandas.
aqualx
User
Beiträge: 7
Registriert: Donnerstag 9. April 2020, 19:54

Danke für deinen Vorschlag.

Gibt es auch eine Lösung ohne die Rohdaten ändern zu müssen?
aqualx
User
Beiträge: 7
Registriert: Donnerstag 9. April 2020, 19:54

Da in den Spalten der Rohdaten, in denen die PLZ vorkommt, auch Ort und evtl. weitere Strings stehen, lassen sich diese nicht mergen. (siehe Bild meines letzten Posts)

Ich könnte jeden Eintrag nach einer 5-stelligen Zahl absuchen und diese in einer extra Spalte auflisten, um anschließend die Rohdaten mit den ausgewählten Ortsdaten zu mergen.
Wäre das bei der großen Anzahl der Zeilen sinnvoll? Wie könnte man dies bewerkstelligen?
Antworten