Większość operacji w pandas
może być dokonany z operatorem łączenia ( groupby
, aggregate
, apply
itp), ale jedynym sposobem mam stwierdzono rzędów filtrów odbywa się za pomocą zwykłego zamka indeksowania
df_filtered = df[df['column'] == value]
Jest to nieprzyjemne, ponieważ wymaga przypisania df
do zmiennej, zanim będę mógł filtrować jej wartości. Czy jest coś podobnego do tego?
df_filtered = df.mask(lambda x: x['column'] == value)
df.query
ipd.eval
wydają się pasować do tego przypadku użycia. Aby uzyskać informacje na tematpd.eval()
rodziny funkcji, ich funkcji i przypadków użycia, odwiedź stronę Dynamic Expression Evaluation w pandach za pomocą pd.eval () .Odpowiedzi:
Nie jestem do końca pewien, czego chcesz, a twój ostatni wiersz kodu też nie pomaga, ale w każdym razie:
Filtrowanie „łańcuchowe” odbywa się poprzez „łańcuchowanie” kryteriów indeksu boolowskiego.
Jeśli chcesz połączyć metody, możesz dodać własną metodę maski i użyć tej.
źródło
(df.A == 1) & (df.D == 6)
, czy „&” jest przeciążonym operatorem w Pandas?pandas.
. Zalecanaimport pandas as pd
.import pandas as pd
jest teraz powszechną praktyką. Wątpię, żeby to było, kiedy odpowiedziałem na pytanie.Filtry można połączyć w łańcuch za pomocą zapytania Pandas :
Filtry można również łączyć w jednym zapytaniu:
źródło
df.query('a in list([1,2])')
,s = set([1,2]); df.query('a in @s')
.Odpowiedź od @lodagro jest świetna. Rozszerzyłbym to, uogólniając funkcję maski jako:
Następnie możesz robić takie rzeczy jak:
źródło
DataFrame
s!Od wersji 0.18.1
.loc
metoda akceptuje wywoływalnym do wyboru. Wraz z funkcjami lambda możesz stworzyć bardzo elastyczne filtry łańcuchowe:Jeśli wszystko, co robisz, to filtrowanie, możesz także pominąć
.loc
.źródło
Oferuję to dla dodatkowych przykładów. To jest ta sama odpowiedź, co https://stackoverflow.com/a/28159296/
Dodam inne zmiany, aby ten post był bardziej przydatny.
pandas.DataFrame.query
query
został stworzony właśnie do tego celu. Rozważ ramkę danychdf
Użyjmy
query
do filtrowania wszystkich wierszy gdzieD > B
Które łączymy
źródło
Miałem to samo pytanie, z tym wyjątkiem, że chciałem połączyć kryteria w stan OR. Format podany przez Wouter Overmeire łączy kryteria w warunek AND, więc oba muszą być spełnione:
Ale odkryłem, że jeśli owiniesz każdy warunek
(... == True)
i połączysz kryteria za pomocą potoku, kryteria zostaną połączone w warunku LUB, spełniane zawsze, gdy jedno z nich jest prawdziwe:źródło
df[(df.A==1) | (df.D==6)]
wystarczyłoby to, co próbujesz osiągnąć?panda zapewnia dwie alternatywy dla odpowiedzi Woutera Overmeire'a, które nie wymagają przesłonięcia. Jeden jest
.loc[.]
na żądanie, jak wdrugi jest
.pipe()
, jak wźródło
Moja odpowiedź jest podobna do pozostałych. Jeśli nie chcesz tworzyć nowej funkcji, możesz użyć tego, co panda już dla ciebie zdefiniowała. Użyj metody potoku.
źródło
a.join(b).pipe(lambda df: df[df.column_to_filter == 'VALUE'])
Jeśli chcesz zastosować wszystkie typowe maski boolowskie, a także maskę ogólnego przeznaczenia, możesz włożyć do pliku następujące elementy, a następnie po prostu przypisać je wszystkie w następujący sposób:
Stosowanie:
Jest to trochę zhackowane, ale może uczynić trochę bardziej czystym, jeśli ciągle siekasz i zmieniasz zestawy danych zgodnie z filtrami. Istnieje również filtr ogólnego przeznaczenia, dostosowany od Daniela Velkova powyżej w funkcji gen_mask, którego można używać z funkcjami lambda lub w razie potrzeby w inny sposób.
Plik do zapisania (używam masks.py):
źródło
To rozwiązanie jest bardziej hackerskie pod względem implementacji, ale uważam, że jest o wiele czystsze pod względem użytkowania, a na pewno jest bardziej ogólne niż inne proponowane.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Nie musisz pobierać całego repo: zapisywanie pliku i robienie
powinno wystarczyć. Następnie używasz go w następujący sposób:
Nieco głupszy przykład użycia:
Nawiasem mówiąc: nawet w przypadku, gdy używasz tylko logicznej kolumny,
może być znacznie bardziej wydajny niż
ponieważ ocenia
cond2
tylko, gdziecond1
jestTrue
.ZASTRZEŻENIE: Najpierw udzieliłem tej odpowiedzi gdzie indziej, ponieważ jej nie widziałem.
źródło
Po prostu chcę dodać demonstrację używającą
loc
do filtrowania nie tylko wierszy, ale także kolumn i niektórych zalet operacji łańcuchowej.Poniższy kod może filtrować wiersze według wartości.
Modyfikując go nieco, możesz również filtrować kolumny.
Dlaczego więc chcemy metody łańcuchowej? Odpowiedź jest prosta: jeśli masz wiele operacji, możesz je łatwo odczytać. Na przykład,
źródło
wydaje się działać: możesz również zagnieżdżać
[]
operatora. Może dodali to odkąd zadałeś pytanie.źródło
df
teraz niekoniecznie odwołuje się do wyników poprzedniej części łańcucha.Jeśli ustawisz wyszukiwanie kolumn jako indeksy, możesz użyć
DataFrame.xs()
przekroju. Nie jest to tak wszechstronne, jakquery
odpowiedzi, ale może być przydatne w niektórych sytuacjach.źródło
Możesz także wykorzystać bibliotekę numpy do operacji logicznych. Jest dość szybki.
źródło