2012-12-13 12 views
78

Mam pandas DataFrame i chcę usunąć z niego wiersze, w których długość ciągu znaków w danej kolumnie jest większa niż 2. Wiem, że mogę użyć df.dropna() pozbyć się wierszy zawierających dowolny kod NaN, ale nie widzę sposobu usuwania wierszy w oparciu o wyrażenie warunkowe.Jak usunąć wiersze z pandy DataFrame w oparciu o wyrażenie warunkowe

Odpowiedź na this question wydaje się bardzo blisko tego, co chcę - wydaje się, że powinienem być w stanie zrobić coś takiego:

df[(len(df['column name']) < 2)] 

ale po prostu pojawia się błąd:

KeyError: u'no item named False' 

Czy ktoś może mi powiedzieć, co robię źle?

Odpowiedz

55

Po zrobieniu len(df['column name']) dostajesz tylko jedną liczbę, a mianowicie liczbę wierszy w DataFrame (tj. Długość samej kolumny). Jeśli chcesz zastosować len do każdego elementu w kolumnie, użyj df['column name'].map(len). Więc spróbuj

df[df['column name'].map(len) < 2] 
+2

wymyśliłem sposób, używając wyrażeń listowych: 'df [[(len (x) <2) for x in df [ 'nazwa kolumny' ]]] 'ale twoja jest o wiele ładniejsza. Dzięki za pomoc! – sjs

255

Aby bezpośrednio odebrać tytuł to pytanie (która jak rozumiem nie jest koniecznie problemem PO, ale mogłyby pomóc innym użytkownikom napotykając to pytanie) jeden sposób, aby to zrobić jest użycie metody drop:

df = df.drop(some labels)

df = df.drop(df[<some boolean condition>].index)

Przykład

Aby usunąć wszystkie wiersze, gdzie kolumna 'wynik' jest < 50:

df = df.drop(df[df.score < 50].index)

W wersji miejscu (jak wskazano w komentarzach)

df.drop(df[df.score < 50].index, inplace=True)

Wiele warunki

(patrz Boolean Indexing)

The operators are: | for or , & for and , and ~ for not . These must be grouped by using parentheses.

Aby usunąć wszystkie wiersze gdzie kolumna "score jest < 50> 20

df = df.drop(df[(df.score < 50) & (df.score > 20)].index)

+14

Po prostu chcę zauważyć, że funkcja upuszczania obsługuje zastępowanie w miejscu. To znaczy,. twoje rozwiązanie jest takie samo jak df.drop (df [df.score <50] .index, inplace = True). Niemniej jednak nie znał sztuczki "indeks".Bardzo mi pomogła – Quickbeam2k1

+1

Jaka jest składnia, jeśli chcesz upuścić wyniki mniejsze niż 50 i większe niż 20? Dzięki. –

+1

@ tommy.carstensen: edytowana odpowiedź – User

24

I szuka rozwiązania tego i potknął się oczywistym podejściem, które jest tylko filtrowanie ramka danych i przypisanie z powrotem do oryginalnej ramki danych tak

df= df[df["score"] > 50]