Mam pandas dataframe i chcesz pozbyć się wierszy, w których kolumna "A" jest negatywna. Znam 2 sposoby, aby to zrobić:

df = df[df['A'] >= 0]

Lub

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

Jakie jest zalecane rozwiązanie? Dlaczego?

7
ojon 5 czerwiec 2018, 01:52

3 odpowiedzi

Najlepsza odpowiedź

Zalecane rozwiązanie jest najbardziej wydajne, co w tym przypadku jest pierwszym.

df = df[df['A'] >= 0]

W drugim rozwiązaniu

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

Powtarzasz proces łączenia. Ale przełammy go na kawałki, aby zrozumieć dlaczego.

Kiedy piszesz

df['A'] >= 0

Tworzysz maskę, serię Boolean z wpisem dla każdego indeksu DF, którego wartość jest prawdziwa lub fałsz według stanu (w tym przypadku, jeśli taka wartość kolumny "A" w danym indeksie jest większa niż lub równe 0).

Kiedy piszesz

df[df['A'] >= 0]

Dostęp do wierszy, dla których maska (DF ['A'] = 0) jest prawdziwa. Jest to metoda krojenia obsługiwana przez Pandas, która pozwala wybrać pewne wiersze, przechodząc serię Boolean i zwróci nową dataframe z odpowiednimi wpisami, dla których seria była prawdziwa.

Wreszcie, kiedy to piszesz

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

Powtarzasz proces, ponieważ

df[df['A'] < 0]

Jest już krojenie dataframe (w tym przypadku wiersze, które chcesz kropla ). Następnie dostajesz te indeksy, wracając do oryginalnego Dataframe i wyraźnie je upuszczając. Nie ma potrzeby tego, już przecięłeś dataframe w pierwszym kroku.

5
VaM 5 czerwiec 2018, 10:52
df = df[df['A'] >= 0]

Jest rzeczywiście szybszym rozwiązaniem. Wystarczy pamiętać, że zwraca widok oryginalnej ramki danych, a nie nowej ramki danych. Może to doprowadzić do kłopotów, na przykład, gdy chcesz zmienić jego wartości, ponieważ pandy da Ci SettingwithCopyWarning.

Prosta poprawka oczywiście jest to, co zalecane jest Wen-Ben:

df = df[df['A'] >= 0].copy()
3
Alex 6 marzec 2019, 21:51

Twoje pytanie brzmi: "Mam dwa identyczne ciasta, ale jeden ma lukier. Co ma więcej kalorii?"

Drugie rozwiązanie robi to samo, ale dwa razy. Wystarczy krok filtrowania, nie ma potrzeby filtrowania, a wtedy Przejdź do wywołania funkcji, która wykonuje dokładnie to samo, co Filtrowanie OP z poprzedniego kroku.

Aby wyjaśnić: Niezależnie od operacji, nadal robisz to samo: generowanie maski boolowskiej, a następnie indeksowanie.

2
cs95 4 czerwiec 2018, 22:55