Próbuję zmodyfikować DataFrame, df
aby zawierała tylko wiersze, dla których wartości w kolumnie closing_price
mieszczą się w przedziale od 99 do 101 i próbuję to zrobić za pomocą poniższego kodu.
Jednak pojawia się błąd
ValueError: Wartość prawdziwości serii jest niejednoznaczna. Użyj a.empty, a.bool (), a.item (), a.any () lub a.all ()
i zastanawiam się, czy można to zrobić bez używania pętli.
df = df[(99 <= df['closing_price'] <= 101)]
df.query
ipd.eval
wydaje się, że dobrze pasuje 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 przy użyciu pd.eval () .Odpowiedzi:
Do
()
grupowania wektora boolowskiego należy użyć, aby usunąć niejednoznaczność.df = df[(df['closing_price'] >= 99) & (df['closing_price'] <= 101)]
źródło
Rozważ także serie między :
df = df[df['closing_price'].between(99, 101)]
źródło
inclusive=True
jest używana domyślnie w programiebetween
, więc możesz zapytać w ten sposóbdf = df[df['closing_price'].between(99, 101)]
between
.df = df[~df['closing_price'].between(99, 101)]
jest fajniejsza alternatywa - użyj metody query () :
In [58]: df = pd.DataFrame({'closing_price': np.random.randint(95, 105, 10)}) In [59]: df Out[59]: closing_price 0 104 1 99 2 98 3 95 4 103 5 101 6 101 7 99 8 95 9 96 In [60]: df.query('99 <= closing_price <= 101') Out[60]: closing_price 1 99 5 101 6 101 7 99
UPDATE: odpowiadając na komentarz:
In [161]: qry = "(closing_price.mean() - 2*closing_price.std())" +\ ...: " <= closing_price <= " + \ ...: "(closing_price.mean() + 2*closing_price.std())" ...: In [162]: df.query(qry) Out[162]: closing_price 0 97 1 101 2 97 3 95 4 100 5 99 6 100 7 101 8 99 9 95
źródło
mean
isd
? Czy to nazwy kolumn?możesz również użyć
.between()
metodyemp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv") emp[emp["Salary"].between(60000, 61000)]
źródło
newdf = df.query('closing_price.mean() <= closing_price <= closing_price.std()')
lub
mean = closing_price.mean() std = closing_price.std() newdf = df.query('@mean <= closing_price <= @std')
źródło
Jeśli masz do czynienia z wieloma wartościami i wieloma danymi wejściowymi, możesz również skonfigurować taką funkcję stosującą. W tym przypadku filtrowanie ramki danych pod kątem lokalizacji GPS mieszczących się w określonych zakresach.
def filter_values(lat,lon): if abs(lat - 33.77) < .01 and abs(lon - -118.16) < .01: return True elif abs(lat - 37.79) < .01 and abs(lon - -122.39) < .01: return True else: return False df = df[df.apply(lambda x: filter_values(x['lat'],x['lon']),axis=1)]
źródło
Zamiast tego
df = df[(99 <= df['closing_price'] <= 101)]
Powinieneś tego użyć
df = df[(df['closing_price']>=99 ) & (df['closing_price']<=101)]
Musimy użyć bitowych operatorów logicznych NumPy |, &, ~, ^ do zapytań złożonych. Również nawiasy są ważne dla pierwszeństwa operatorów.
Aby uzyskać więcej informacji, możesz odwiedzić łącze: porównania, maski i logika boolowska
źródło