Wählen Sie Zeilen aus einem Pandas-Dataframe mit einem anonymen 2D-Array für mehrere Spalten

7

Daten

Ich habe ein Datenframe, das 5 Spalten enthält:

  • Breite und Länge des Ursprungs ( origin_lat , origin_lng )
  • Breite und Länge des Ziels ( dest_lat , dest_lng )
  • Ein Ergebnis, das aus den anderen Feldern
  • berechnet wurde

Ich habe eine Matrix M , die Paare von Ursprung und Ziel Breite / Länge enthält. Einige dieser Paare existieren im Datenrahmen, andere nicht.

Ziel

Mein Ziel ist zweifach:

  1. Wählen Sie alle Paare aus M , die in den ersten vier Spalten des Datenrahmens nicht vorhanden sind, wenden Sie eine Funktion func auf sie an (um die Score-Spalte zu berechnen) und hängen Sie die Ergebnisse an den vorhandenen Datenrahmen an. Hinweis: Wir sollten die Bewertung für bereits vorhandene Zeilen nicht neu berechnen.
  2. Nachdem Sie die fehlenden Zeilen hinzugefügt haben, markieren Sie alle Zeilen, die durch die Auswahlmatrix M in einem neuen Datenrahmen dfs .
  3. definiert sind

Beispielcode

%Vor%

Was mir einen Datenrahmen df so gibt:

%Vor%

Ich kann dann künstlich die Auswahlmatrix M erstellen, die 3 Zeilen enthält, die im Datenrahmen vorhanden sind, und 3 Zeilen, die dies nicht tun.

%Vor%

Die Matrix M sieht folgendermaßen aus:

%Vor%

Von hier aus kann ich nicht wissen, welche Zeilen von M nicht in df vorhanden sind, und füge sie hinzu. Ich weiß auch nicht, wie man alle Zeilen von df in M auswählt.

Ideen

Meine Idee war, die fehlenden Zeilen zu identifizieren, sie an df mit einem nan score anzuhängen und den Score nur für die nan Zeilen neu zu berechnen. Ich weiß jedoch nicht, wie ich diese Zeilen effizient auswählen kann, ohne jedes Element der Matrix M zu durchlaufen.

Irgendwelche Vorschläge? Vielen Dank für Ihre Hilfe!

    
nbeuchat 11.09.2017, 17:17
quelle

5 Antworten

7

Gibt es einen Grund, merge nicht zu verwenden?

%Vor%

Er macht genau das, was Sie vorgeschlagen haben: Fügt die fehlenden Zeilen df mit einem Nanopunkt hinzu, identifiziert nans und berechnet die Punktzahlen für diese Zeilen.

    
igrinis 15.09.2017, 15:48
quelle
2

Also wird diese Lösung jede Zeile in M, aber nicht jedes Element durchlaufen. Die Schritte sind:

  1. Gehen Sie durch jede Zeile in M ​​und identifizieren Sie, ob es in df ist oder nicht. Wenn es darin ist, speichern Sie den Index. Wenn dies nicht der Fall ist, berechnen Sie den Punktestand und speichern Sie.
  2. Erstellen Sie den M-Datenrahmen, indem Sie die neuen M Zeilen von oben übernehmen und die in df.
  3. gefundenen Zeilen anhängen
  4. Erstellen Sie die neue Version des Datenrahmens, indem Sie einfach die neuen Zeilen von M anfügen.

Hoffentlich hilft das - ich weiß, dass es immer noch eine Schleife hat, aber ich habe nicht herausgefunden, wie ich es loswerden kann. Ihre Frage besagt auch nur, dass df groß sein könnte, und dass Sie Schleifenelemente von M vermeiden wollten, was dies zumindest dadurch vermeidet, dass nur Zeilen durchgeschleift werden.

%Vor%     
Ken Syme 15.09.2017 14:59
quelle
2

Konvertiere M in ein DataFrame , concat mit df :

%Vor%

Löschen Sie die doppelten Zeilen nur basierend auf den Spalten in geocols :

%Vor%

Erhalte eine Maske von Zeilen mit NaN für score :

%Vor%

Übernehmen Sie die Punkte für die maskierten Zeilen und speichern Sie sie in df3 :

%Vor%

Sie erhalten ein SettingWithCopyWarning, aber es funktioniert.

    
Kyle 15.09.2017 15:17
quelle
2

Sie machen geospatiale Analysen, ich denke, es ist sehr wichtig, einige Standardansätze zu integrieren. Jede Zeile / Ihr Eintrag wird nämlich durch ein Koordinatenpaar identifiziert, um sie in WKT zu konvertieren. würde viel Sinn machen.

Bei WKT müssen Sie nur überprüfen, ob der WKT der neuen Daten bereits in den alten Daten gefunden wurde:

%Vor%

Zusätzliche Kommentare:

  1. Bei geospatialen Informationen, die in WKT / WKB codiert sind, kann man leicht verfügbare Geospatial-Bibliotheken verwenden, um die score -Spalte zu berechnen (falls solche Berechnungen erforderlich sind)
  2. Das Einstellen der korrekten Genauigkeit für WKT ist normalerweise eine notwendige Überlegung für Geodaten (hier setze ich es auf precision bis 6)
  3. Leistung. Die Dimension von df (oder df.append(df2) part) ändert sich jedes Mal, wenn Sie neue Zeilen aus einem neuen Datenrahmen hinzufügen, in diesem Fall df2 . Inhärent bedeutet dies, dass die Leistung surfer wird, wenn solche Aktualisierungen sehr häufig auftreten.
  4. Wenn die Analyse auf Geodaten aufgebaut ist, sollten Geopandas untersucht werden.
CT Zhu 17.09.2017 05:08
quelle
0

Lassen Sie uns zuerst M als einen Datenrahmen namens df_temp:

formen %Vor%

Mit merge können wir jetzt leicht die Elemente in df verfolgen, die in M ​​waren:

%Vor%

Hinweis : Das right_index-Argument ermöglicht es uns, die Indexierung von df beizubehalten, so dass wir wissen, welche Zeilen von df auch in M ​​

waren

Schließlich können wir Zeilen in df_temp hinzufügen, die nicht in df:

waren %Vor%

Hinweis: Die Untergruppe in drop_duplicates befindet sich nur hier, weil Ihre Bewertungsfunktion nichtdeterministisch ist

    
plalanne 20.09.2017 13:45
quelle