Seite 1 von 1

DataFrame filtern mit .contains?

Verfasst: Dienstag 28. April 2020, 11:49
von aqualx
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])

Re: DataFrame filtern mit .contains?

Verfasst: Dienstag 28. April 2020, 12:02
von Sirius3
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?

Re: DataFrame filtern mit .contains?

Verfasst: Dienstag 28. April 2020, 12:10
von aqualx
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.

Re: DataFrame filtern mit .contains?

Verfasst: Dienstag 28. April 2020, 13:42
von kbr
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.

Re: DataFrame filtern mit .contains?

Verfasst: Dienstag 28. April 2020, 14:10
von aqualx
Danke für deinen Vorschlag.

Gibt es auch eine Lösung ohne die Rohdaten ändern zu müssen?

Re: DataFrame filtern mit .contains?

Verfasst: Mittwoch 29. April 2020, 12:39
von aqualx
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?