Ändern der Werte in Pandas Dataframe funktioniert

8

Ich habe ein Problem mit dem Ändern von Werten in einem Datenrahmen. Ich möchte auch über ein Problem, das ich lösen muss, und die richtige Art, Pandas zu benutzen, um es zu lösen, beraten. Ich schätze die Hilfe bei beiden. Ich habe eine Datei mit Informationen über den Grad der Übereinstimmung der Audiodateien mit den Lautsprechern. Die Datei sieht ungefähr so ​​aus:

%Vor%

Was ich tun muss, ist eine Art ausgeklügeltes Zählen. Ich muss die Ergebnisse nach Sprecher gruppieren und für jeden Sprecher eine Berechnung berechnen. Ich fahre dann mit dem Sprecher fort, der die beste Berechnung für mich gemacht hat, aber bevor ich fortfahre, muss ich alle Dateien markieren, die ich für die Berechnung verwendet habe, dh den isUsed-Wert für jede Zeile ändern, in der sie erscheinen (Dateien können erscheinen) mehr als einmal) zu WAHR. Dann mache ich eine weitere Iteration. Berechnen Sie für jeden Lautsprecher die verwendeten Dateien und so weiter, bis keine Lautsprecher mehr berechnet werden können.

Ich habe viel darüber nachgedacht, wie man diesen Prozess mit Pandas implementieren kann (es ist ziemlich einfach in regulärem Python zu implementieren, aber es wird eine Menge Schleifen und Datenstrukturierung benötigen, dass meine Vermutung den Prozess erheblich verlangsamen wird. m diesen Prozess zu verwenden, um Pandas Fähigkeiten tiefer zu lernen)

Ich kam mit der folgenden Lösung heraus. Als Vorbereitungsschritte gruppiere ich nach Sprechernamen und setze den Dateinamen als Index mit der Methode set_index. Ich werde dann über die groupbyObj iterieren und die Berechnungsfunktion anwenden, die den ausgewählten Lautsprecher und die zu markierenden Dateien als verwendet zurückgibt.

Dann werde ich über die Dateien iterieren und sie als gebraucht markieren (das wäre schnell und einfach, da ich sie vorher als Indizes gesetzt habe), und so weiter, bis ich mit der Berechnung fertig bin.

Erstens bin ich mir über diese Lösung nicht sicher, also kannst du mir deine Gedanken dazu sagen. Jetzt habe ich versucht, dies zu implementieren, und habe Probleme bekommen:

Zuerst habe ich nach Dateinamen indexiert, kein Problem hier:

%Vor%

Dann wähle ich eine Datei und überprüfe, ob ich die für diese Datei relevanten Einträge bekomme:

%Vor%

Jetzt Probleme auch hier. Dann habe ich versucht, den isUsed-Wert für diese Datei auf True zu ändern, und das, wo ich das Problem hatte:

%Vor%

Sie sehen also das Problem. Nichts hat sich verändert. Was mache ich falsch? Soll das oben beschriebene Problem mit Pandas gelöst werden?

Und auch: 1. Wie kann ich eine bestimmte Gruppe durch ein groupby Objekt ansprechen? bcz Ich dachte, vielleicht, anstatt die Dateien als indiziert, Gruppierung von einer Datei, und die Verwendung dieser groupby obj, um eine ändernde Funktion auf alle seine Vorkommen anzuwenden. Aber ich habe keine Möglichkeit gefunden, mich an eine bestimmte Gruppe zu wenden und den Gruppennamen als Parameter und Aufruf an alle Gruppen zu übergeben und dann nur auf einen von ihnen zu wirken, erschien mir nicht "richtig".

Ich hoffe, es ist nicht zu lange ...:)

    
idoda 01.08.2013, 13:24
quelle

1 Antwort

17

Das Indizieren von Panda-Objekten kann zwei grundlegend verschiedene Objekte zurückgeben: eine Ansicht oder eine Kopie.

Wenn mask ein Basissegment ist, gibt df.ix[mask] eine Ansicht von df zurück. Ansichten teilen die gleichen zugrunde liegenden Daten wie das ursprüngliche Objekt ( df ). Wenn Sie also die Ansicht ändern, wird auch das ursprüngliche Objekt geändert.

Wenn mask etwas komplizierter ist, wie zum Beispiel eine willkürliche Folge von Indizes, gibt df.ix[mask] eine Kopie von einigen Zeilen in df zurück. Das Ändern der Kopie hat keine Auswirkungen auf das Original.

In Ihrem Fall gibt wave_path eine Kopie zurück, da die Zeilen, die dasselbe ind_res.ix[example_file] teilen, an beliebigen Stellen vorkommen. Also

%Vor%

hat keine Auswirkungen auf ind_res .

Stattdessen könnten Sie

verwenden %Vor%

zum Ändern von ind_res . Siehe jedoch unten für eine groupby Suggestion, von der ich denke, dass sie näher an dem liegt, was Sie wirklich wollen.

Jeff hat bereits einen Link zu den Pandas bereitgestellt Dokumente , die das

angeben
  

Die Regeln, wann eine Ansicht der Daten zurückgegeben wird, sind vollständig   abhängig von NumPy.

Hier sind die (komplizierten) Regeln, die beschreiben wann Eine Ansicht oder Kopie wird zurückgegeben . Grundsätzlich lautet die Regel jedoch, wenn der Index ein Segment mit regelmäßigen Abständen des zugrunde liegenden Arrays anfordert, dann wird eine Ansicht zurückgegeben, andernfalls wird (bei Bedarf) eine Kopie zurückgegeben.

Hier ist ein einfaches Beispiel, das den grundlegenden Slice verwendet. Eine Ansicht wird von df.ix zurückgegeben. Wenn also subdf geändert wird, wird auch df geändert:

%Vor%

Hier ist ein einfaches Beispiel, das "fancy indexing" verwendet (willkürliche Zeilen ausgewählt). Eine Kopie wird von df.ix zurückgegeben. Das Ändern von subdf wirkt sich nicht auf df aus.

%Vor%

Beachten Sie, dass der einzige Unterschied zwischen den beiden Beispielen darin besteht, dass im ersten Fall, in dem eine Ansicht zurückgegeben wird, der Index [0,1,2,3] war, während in der zweiten, wo eine Kopie zurückgegeben wird, der Index war [0,1,0,3].

Da wir Zeilen sind, in denen der Index 0 ist, können wir das im ersten Beispiel mit einem Basis-Slice machen. Im zweiten Beispiel können die Zeilen, deren Index gleich 0 ist, an beliebigen Stellen erscheinen, so dass eine Kopie zurückgegeben werden muss.

Obwohl ich über die Subtilität von Pandas / NumPy-Slicing geschimpft habe, glaube ich das wirklich nicht.

%Vor%

ist, was Sie letztlich suchen. Sie möchten wahrscheinlich etwas mehr wie

tun %Vor%

was zu

führt %Vor%     
unutbu 01.08.2013, 14:13
quelle

Tags und Links