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 ...:)
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
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
angebenDie 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:
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.
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%