2017-03-20 1 views

Antwort

4

Sie können auf jede Zeile wiederum diesen Test tun mit pandas.DataFrame.apply()

print(df[df['alfa'].apply(lambda x: len(x.split(',')) < 3)]) 

Gibt:

alfa beta ceta 
1 a,b d,e,f g,h,k 
2 j,k c,k,l f,k,n 
2

Wie ist das?

df = df[df['alpha'].str.split(',', expand=True)[2].isnull()] 

expand=True Mit erstellt einen neuen Datenrahmen mit einer Spalte für jedes Element in der Liste. 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 aufweist, die Spalte [2] eine KeyError verursacht. Aus diesem Grund ist es sicherer, die von @Stephen Rauch veröffentlichte Lösung zu verwenden.

2

Es gibt zumin-dest zwei Möglichkeiten, um das gegebene DF die Teilmenge:

1) Split auf dem Kommaseparator und dann berechnen Länge der resultierenden list:

df[df['alfa'].str.split(",").str.len().lt(3)] 

2) Zählnummer Kommata und fügen Sie 1 zum Ergebnis für das letzte Zeichen zu berücksichtigen:

df[df['alfa'].str.count(",").add(1).lt(3)] 

Beide produzieren:

enter image description here

3

Dies ist die numpy Version von @ NickilMaveli Antwort.

mask = np.core.defchararray.count(df.alfa.values.astype(str), ',') <= 1 
pd.DataFrame(df.values[mask], df.index[mask], df.columns) 

    alfa beta ceta 
1 a,b d,e,f g,h,k 
2 j,k c,k,l f,k,n 

naive Timing

enter image description here

1

Hier ist eine Option, die am einfachsten zu erinnern und umarmen noch die Datenrahmen, die die "bleeding heart" von Pandas ist:

1) Erstellen Sie eine neue Spalte im Dataframe wi ten Wert für die Länge:

df['length'] = df.alfa.str.len() 

2) Index der neue Spalte:

df = df[df.length < 3] 

der Vergleich zu den oben genannten Zeitpunkt Dann, was in diesem Fall nicht wirklich relevant ist, wie die Daten sehr klein und in der Regel weniger wichtig ist als wie wahrscheinlich Sie gehen zu erinnern, wie etwas zu tun und nicht Ihren Workflow zu unterbrechen:

Schritt 1:

%timeit df['length'] = df.alfa.str.len() 

359 μs ± 6,83 μs pro Schleife (Mittelwert ± Std. Entwickler von 7 Läufe 1000 jeweils) Schleifen

Schritt 2:

df = df[df.length < 3] 

627 & mgr; s ± 76,9 & mgr; s pro Schleife (Mittelwert ± STD dev von 7 verläuft 1000 Schlaufen jeweils)

Guten.. Neu ist, dass die Zeit bei wachsender Größe nicht linear anwä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).

Verwandte Themen