2017-03-20 28 views

Odpowiedz

4

Można zrobić ten test do każdego wiersza z kolei za pomocą pandas.DataFrame.apply()

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

Daje:

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

Jak to jest?

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

Korzystanie expand=True tworzy nowy dataframe z jednej kolumnie dla każdego elementu na liście. Jeśli lista zawiera trzy lub więcej elementów, wówczas trzecia kolumna będzie mieć wartość inną niż null.

Jednym z problemów związanych z tym podejściem jest to, że jeśli żadna z list nie ma trzech lub więcej elementów, wybranie kolumny [2] spowoduje KeyError. Na tej podstawie bezpieczniej jest skorzystać z rozwiązania opublikowanego przez @Stephen Rauch.

2

Istnieje w temperaturze co najmniej na dwa sposoby do podzbioru daną DF:

1) Podział separatora przecinek i obliczają długość otrzymanego list:

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

2) zliczyć przecinkami i dodać 1 do wyniku w celu uwzględnienia ostatniego znaku:

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

oba produkują:

enter image description here

3

To jest wersja numpy wersji odpowiedzi @ NickilMaveli.

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 

naiwny rozrządu

enter image description here

1

Tutaj jest opcja, że ​​to najłatwiejszy do zapamiętania i nadal obejmując DataFrame która jest "krwawi serce" Pand:

1) Utwórz nową kolumnę w ramce danych wi th wartość dla długości:

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

2) Główna stosując nową kolumnę:

df = df[df.length < 3] 

Wtedy porównanie powyższych czasy, które nie są bardzo istotne w tym przypadku, gdy dane są bardzo małe i zwykle jest mniej ważna niż prawdopodobne, jak idziesz do zapamiętania, jak coś zrobić, a nie konieczności przerywania przepływu pracy:

krok 1:

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

359 μs ± 6,83 μs na pętlę (średnia ± std. dev. 7 biegnie 1000 pętli każdy)

Etap 2:

df = df[df.length < 3] 

627 ms ± 76,9 mikrosekundy na pętli (średnia ± standardowym dev 7 zapewnia, 1000 pętli każdy)

dobra.. wiadomo, że kiedy rozmiar rośnie, czas nie rośnie liniowo. Na przykład wykonanie tej samej operacji z 30 000 wierszy danych zajmuje około 3ms (czyli dane 10 000x, 3-krotne zwiększenie prędkości). Pandas DataFrame jest jak pociąg, pobiera energię, aby go uruchomić (więc nie jest to świetne dla małych rzeczy przy absolutnym porównaniu, ale obiektywnie nie ma większego znaczenia ... tak jak w przypadku małych danych wszystko dzieje się szybko).