Moje tablice numpy używają np.nan
do oznaczania brakujących wartości. Podczas iteracji zestawu danych muszę wykrywać takie brakujące wartości i traktować je w specjalny sposób.
Naiwnie użyłem numpy.isnan(val)
, co działa dobrze, chyba że val
nie jest wśród podzbioru typów obsługiwanych przez numpy.isnan()
. Na przykład brakujące dane mogą wystąpić w polach ciągów, w takim przypadku otrzymuję:
>>> np.isnan('some_string')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Not implemented for this type
Czy poza napisaniem drogiego opakowania, które wyłapuje wyjątek i zwraca False
, istnieje sposób, aby poradzić sobie z tym elegancko i wydajnie?
pandas
haspandas.isnull()
: Nie jestem pewien, czy to spełnia Twoje potrzeby, więc niektóre przykładowe dane mogą być dobre.pandas.isnull()
wydaje się działać idealnie. Jedynym typem danych, z którym obecnie mam do czynienia, a którym są podziały,numpy.isnan()
jest ciąg ipandas.isnull()
dobrze go obsługuje. W rzeczywistości wydaje się, że dobrze radzi sobie z każdym przypadkowym przedmiotem, który w niego rzuciłem. Czy były jakieś konkretne problemy, którymi się martwiłeś? W przeciwnym razie możesz przesłać komentarz jako pełną odpowiedź, ponieważ wydaje się, że jest to odpowiedź kanoniczna, przynajmniej dla użytkowników pand.Odpowiedzi:
pandas.isnull()
(równieżpd.isna()
w nowszych wersjach) sprawdza brakujące wartości zarówno w tablicach liczbowych, jak i ciągów / obiektów. Na podstawie dokumentacji sprawdza:Szybki przykład:
Pomysł użycia
numpy.nan
do reprezentowania brakujących wartości jest czymś, copandas
wprowadziło, dlategopandas
ma narzędzia do radzenia sobie z tym.Czasy danych też (jeśli używasz
pd.NaT
, nie musisz określać dtype)źródło
Czy twój typ jest naprawdę dowolny? Jeśli wiesz, że będzie to po prostu int float lub string, możesz to zrobić
zakładając, że jest opakowany w numpy, zawsze będzie miał dtype i tylko zmiennoprzecinkowe i złożone mogą być NaN
źródło
dtype
. Być może będziesz musiał to zrobićtype(val) == 'float'
type(val) == float and np.isnan(val)
- pracował dla mnie