Pandas: Aggregieren, wenn Spalte numpy Arrays enthält

8

Ich benutze einen Pandas DataFrame, in dem eine Spalte numpy Arrays enthält. Beim Versuch, diese Spalte über Aggregation zu summieren, erhalte ich den Fehler 'Muss aggregierten Wert erzeugen'.

z.B.

%Vor%

Das funktioniert so, wie ich es erwarten würde:

%Vor%

Ausgabe:

%Vor%

Da mein realer Datenrahmen jedoch mehrere numerische Spalten hat, wird arraydata nicht als Standardspalte für die Aggregation ausgewählt, und ich muss sie manuell auswählen. Hier ist ein Ansatz, den ich versucht habe:

%Vor%

Hier ist ein anderer:

%Vor%

Beide geben die gleiche Ausgabe:

%Vor%

Wenn ich jedoch eine Spalte verwende, die numerische anstelle von Array-Daten verwendet, funktioniert es gut. Ich kann das umgehen, aber es ist verwirrend und ich frage mich, ob das ein Fehler ist oder ob ich etwas falsch mache. Ich habe den Eindruck, dass die Verwendung von Arrays hier ein bisschen ein Randfall ist und in der Tat nicht sicher war, ob sie unterstützt wurden. Ideen?

Danke

    
pteehan 07.06.2013, 02:25
quelle

2 Antworten

9

Eine vielleicht klügere Methode wäre das Iterieren über das GroupBy -Objekt (es erzeugt (grouping_value, df_subgroup) -Tupel. Um beispielsweise das zu erreichen, was Sie hier haben wollen, könnten Sie folgendes tun:

%Vor%

Das ist sehr ähnlich dem, was Pandas unter der Haube sowieso machen [groupby, dann mach etwas Aggregation, dann füge wieder hinzu], so dass du nicht wirklich viel verlierst.

Tauchen in die Internals

Das Problem hier ist, dass pandas explizit überprüft, dass die Ausgabe nicht ein ndarray ist, weil es Ihr Array intelligent umformen möchte, wie Sie in diesem Ausschnitt von _aggregate_named sehen können Fehler tritt auf.

%Vor%

Meine Vermutung ist, dass dies geschieht, weil groupby explizit eingerichtet wurde, um zu versuchen, einen DataFrame intelligent mit den gleichen Indizes und allem, was gut ausgerichtet ist, wieder zusammenzusetzen. Da es in einem DataFrame selten verschachtelte Arrays gibt, sucht es nach ndarrays, um sicherzustellen, dass Sie tatsächlich eine Aggregatfunktion verwenden. In meinem Bauch fühlt sich das wie ein Job für Panel an, aber ich bin mir nicht sicher, wie ich es perfekt umsetzen kann. Nebenbei können Sie dieses Problem umgehen, indem Sie Ihre Ausgabe in eine Liste wie folgt konvertieren:

%Vor%

Pandas beschwert sich nicht, weil Sie jetzt ein Array von Python-Objekten haben. [Aber das ist wirklich nur Betrug um den Typcheck]. Und wenn Sie zurück in Array konvertieren möchten, wenden Sie einfach np.array darauf an.

%Vor%

Wie Sie dieses Problem lösen möchten, hängt von warum Sie haben Spalten von ndarray ab und ob Sie alles andere zur gleichen Zeit aggregieren möchten. Das heißt, Sie können immer über GroupBy iterieren, wie ich oben gezeigt habe.

    
Jeff Tratner 07.06.2013, 03:04
quelle
2

Pandas funktioniert viel effizienter, wenn Sie dies nicht tun (z. B. numerische Daten verwenden, wie Sie vorschlagen). Eine andere Alternative ist die Verwendung eines Panel -Objekts für diese Art von mehrdimensionalen Daten.

>

Wenn man sagt, dass dies wie ein Fehler aussieht, wird die Exception nur ausgelöst, weil das Ergebnis ein Array ist:

%Vor%

Wenn Sie diese zwei Zeilen rücksichtslos aus dem Quellcode entfernen, funktioniert es wie erwartet:

%Vor%

Hinweis: Sie sind fast sicher aus einem bestimmten Grund dort ...

    
Andy Hayden 07.06.2013 03:02
quelle

Tags und Links