Wie entferne ich eine Zeile aus Pandas Datenrahmen basierend auf der Länge der Spaltenwerte?

8

Im folgenden pandas.DataFframe :

%Vor%

Wie lösche ich die Zeilen, in denen die Spaltenwerte für alfa mehr als 2 Elemente enthalten? Dies kann mit der Längenfunktion erfolgen, die ich kenne, aber keine spezifische Antwort finde.

%Vor%     
everestial007 20.03.2017, 02:47
quelle

5 Antworten

4

Sie können diesen Test nacheinander mit pandas.DataFrame.apply()

für jede Zeile ausführen %Vor%

Gibt:

%Vor%     
Stephen Rauch 20.03.2017 02:55
quelle
3

Dies ist die numpy Version von @ NickilMavelis Antwort.

%Vor%

naives Timing

    
piRSquared 20.03.2017 06:17
quelle
2

Wie ist das?

%Vor%

Mit expand=True wird ein neuer Datenrahmen mit einer Spalte für jedes Element in der Liste erstellt. Wenn die Liste drei oder mehr Elemente enthält, hat die dritte Spalte einen Wert ungleich null.

Ein Problem mit diesem Ansatz besteht darin, dass, wenn keine der Listen drei oder mehr Elemente enthält, die Auswahl der Spalte [2] eine KeyError verursacht. Auf dieser Grundlage ist es sicherer, die von @Stephen Rauch veröffentlichte Lösung zu verwenden.

    
Craig 20.03.2017 02:55
quelle
2

Es gibt mindestens zwei Möglichkeiten, die angegebene DF zu unterteilen:

1) Teilen Sie das Komma-Trennzeichen und berechnen Sie die Länge des resultierenden list :

%Vor%

2) Zählen Sie die Anzahl der Kommas und fügen Sie 1 zum Ergebnis hinzu, um das letzte Zeichen zu berücksichtigen:

%Vor%

Beide produzieren:

    
Nickil Maveli 20.03.2017 05:33
quelle
1

Hier ist eine Option, die am einfachsten zu merken ist und die DataFrame, die das "blutende Herz" der Pandas ist, immer noch umarmt:

1) Erstellen Sie eine neue Spalte im Datenframe mit einem Wert für die Länge:

%Vor%

2) Index mit der neuen Spalte:

%Vor%

Dann der Vergleich zu den oben genannten Zeitpunkten, die in diesem Fall nicht wirklich relevant sind, da die Daten sehr klein sind, und normalerweise weniger wichtig ist als, wie wahrscheinlich Sie sich erinnern werden, wie Sie etwas tun und nicht Ihre eigenen unterbrechen müssen Workflow:

Schritt 1:

%Vor%

359 μs ± 6,83 μs pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 1000 Schleifen)

Schritt 2:

%Vor%

627 μs ± 76,9 μs pro Schleife (Mittelwert ± Standardabweichung von 7 Läufen, jeweils 1000 Schleifen)

Die gute Nachricht ist, dass wenn die Größe wächst, die Zeit nicht linear wächst. Zum Beispiel dauert die Ausführung der gleichen Operation mit 30.000 Datenzeilen etwa 3 ms (also 10.000x Daten, 3-fache Geschwindigkeitserhöhung). Pandas DataFrame ist wie ein Zug, braucht Energie, um es in Gang zu bringen (also nicht großartig für kleine Dinge im absoluten Vergleich, aber objektiv ist es nicht so wichtig ... wie bei kleinen Daten sind die Dinge sowieso schnell).

    
mikkokotila 02.01.2018 23:47
quelle