Próbuję ustalić, czy w kolumnie Pandy znajduje się wpis, który ma określoną wartość. Próbowałem to zrobić if x in df['id']
. Myślałem, że to działa, z wyjątkiem sytuacji, gdy podałem mu wartość, o której wiedziałem, że nie ma w kolumnie 43 in df['id']
, nadal zwracała True
. Kiedy podzbiorę na ramkę danych zawierającą tylko wpisy pasujące do brakującego identyfikatora df[df['id'] == 43]
, oczywiście nie ma w niej żadnych wpisów. Jak ustalić, czy kolumna w ramce danych Pandas zawiera określoną wartość i dlaczego moja obecna metoda nie działa? (FYI, mam ten sam problem, gdy używam implementacji w tej odpowiedzi na podobne pytanie).
156
'a' in s.values
powinno być szybsze w długich seriach.'a' in s
pandy wolą sprawdzać indeks, a nie wartości serii? W słownikach sprawdzają klucze, ale seria pandy powinna zachowywać się bardziej jak lista lub tablica, prawda?s.values
idf.values
jest wysoce zniechęcone. Zobacz to . Ws.values
niektórych przypadkach jest znacznie wolniejszy..to_numpy
czy.array
są dostępne w serialu, więc nie jestem do końca pewien, co oni opowiadają alternatywa (nie czytam „odradza”). W rzeczywistości mówią, że .values może nie zwracać tablicy numpy, np. W przypadku kategorialnego ... ale to jest w porządku, ponieważin
nadal będzie działać zgodnie z oczekiwaniami (a nawet bardziej wydajnie, że jest to odpowiednik tablicy numpy)Możesz również użyć pandas.Series.isin, chociaż jest trochę dłuższy niż
'a' in s.values
:Ale to podejście może być bardziej elastyczne, jeśli musisz dopasować wiele wartości naraz dla ramki DataFrame (zobacz DataFrame.isin )
źródło
s.isin(['a']).any()
found.count()
wola zawiera liczbę meczówA jeśli jest 0, oznacza to, że w kolumnie nie znaleziono ciągu.
źródło
na=False
iregex=False
dla mojego przypadku użycia, jak wyjaśniono tutaj: pandas.pydata.org/pandas-docs/stable/reference/api/ ...Zrobiłem kilka prostych testów:
Co ciekawe, nie ma znaczenia, czy spojrzysz na 9 czy 999999, wygląda na to, że użycie w składni zajmuje mniej więcej tyle samo czasu (musi być używane wyszukiwanie binarne)
Wydaje się, że użycie x.values jest najszybsze, ale może w pandach istnieje bardziej elegancki sposób?
źródło
Lub użyj
Series.tolist
lubSeries.any
:Series.tolist
tworzy listę o aSeries
, a drugą otrzymuję po prostu wartość logicznąSeries
ze zwykłegoSeries
, a następnie sprawdzam, czy są jakieśTrue
s w zmiennej boolowskiejSeries
.źródło
Prosty stan:
źródło
Posługiwać się
Jeśli
x
jest obecny w,id
to zwróci listę indeksów, w których jest obecny, w przeciwnym razie wyświetli pustą listę.źródło
Nie sugeruję używania „wartości w serii”, co może prowadzić do wielu błędów. Zapoznaj się z tą odpowiedzią, aby uzyskać szczegółowe informacje: Używanie operatora z seriami Pandas
źródło
Załóżmy, że twoja ramka danych wygląda następująco:
Teraz chcesz sprawdzić, czy nazwa pliku „80900026941984” jest obecna w ramce danych, czy nie.
Możesz po prostu napisać:
źródło