Na przykład mam prosty DF:
import pandas as pd
from random import randint
df = pd.DataFrame({'A': [randint(1, 9) for x in xrange(10)],
'B': [randint(1, 9)*10 for x in xrange(10)],
'C': [randint(1, 9)*100 for x in xrange(10)]})
Czy mogę wybrać wartości z „A”, dla których odpowiadające wartości dla „B” będą większe niż 50, a dla „C” - nie równe 900, stosując metody i idiomy Pand?
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:
Pewnie! Ustawiać:
Możemy zastosować operacje na kolumnach i uzyskać obiekty z serii boolean:
[Aktualizacja, aby przejść do nowego stylu
.loc
]:Następnie możemy użyć ich do zindeksowania obiektu. Aby uzyskać dostęp do odczytu, możesz połączyć łańcuchy indeksów:
ale możesz wpaść w kłopoty z powodu różnicy między widokiem a kopią, która robi to w celu dostępu do zapisu. Zamiast tego możesz użyć
.loc
:Pamiętaj, że przypadkowo wpisałem
== 900
i nie!= 900
, lub~(df["C"] == 900)
, ale jestem zbyt leniwy, aby to naprawić. Ćwiczenie dla czytelnika. : ^)źródło
.loc
aktualizacji - dobrze by było, gdybyś wyjaśnił, skąd mamy kopię i gdzie widok.{TypeError}cannot compare a dtyped [int64] array with a scalar of type [bool]
Innym rozwiązaniem jest użycie metody zapytania :
Teraz, jeśli chcesz zmienić zwracane wartości w kolumnie A, możesz zapisać ich indeks:
.... i użyj,
.iloc
aby je zmienić, tj .:źródło
I pamiętaj, aby używać nawiasów!
Należy pamiętać, że
&
operator bierze pierwszeństwo nad operatorami takimi jak>
lub<
itd. Dlategoocenia na
False
. Dlatego jeśli używaszpd.loc
, musisz umieścić nawiasy wokół instrukcji logicznych, w przeciwnym razie pojawi się błąd. Właśnie dlatego:zamiast
co spowodowałoby
źródło
Możesz użyć pand, ma kilka wbudowanych funkcji do porównania. Więc jeśli chcesz wybrać wartości „A”, które są spełnione przez warunki „B” i „C” (zakładając, że chcesz odzyskać obiekt pand DataFrame)
df[['A']][df.B.gt(50) & df.C.ne(900)]
df[['A']]
zwróci Ci kolumnę A w formacie DataFrame.funkcja „gt” pandy zwróci pozycje kolumny B większe niż 50, a „ne” zwróci pozycje nie równe 900.
źródło