Odpowiedź jwilnera jest natychmiastowa. Badałem, czy jest szybsza opcja, ponieważ z mojego doświadczenia, sumowanie płaskich tablic jest (dziwnie) szybsze niż liczenie. Ten kod wydaje się szybszy:
df.isnull().values.any()
Na przykład:
In[2]: df = pd.DataFrame(np.random.randn(1000,1000))In[3]: df[df >0.9]= pd.np.nan
In[4]:%timeit df.isnull().any().any()100 loops, best of 3:14.7 ms per loop
In[5]:%timeit df.isnull().values.sum()100 loops, best of 3:2.15 ms per loop
In[6]:%timeit df.isnull().sum().sum()100 loops, best of 3:18 ms per loop
In[7]:%timeit df.isnull().values.any()1000 loops, best of 3:948µs per loop
df.isnull().sum().sum()jest nieco wolniejszy, ale oczywiście ma dodatkowe informacje - liczbę NaNs.
Dziękuję za testy porównawcze czasu. Zaskakujące jest to, że pandasnie ma do tego wbudowanej funkcji. To prawda, że post @ JGreenwell df.describe()może to zrobić, ale nie ma bezpośredniej funkcji.
hlin117
2
Właśnie mierzyłem czas df.describe()(bez znalezienia NaNs). W przypadku tablicy 1000 x 1000 pojedyncze połączenie zajmuje 1,15 sekundy.
hlin117
3
: 1, Ponadto df.isnull().values.sum()jest nieco szybszy niżdf.isnull().values.flatten().sum()
Zero
Ach, dobry chwyt @JohnGalt - zmienię moje rozwiązanie, aby usunąć z .flatten()plakatu. Dzięki.
S Anand
6
Nie próbowałeś df.isnull().values.any(), dla mnie jest szybszy niż inni.
CK1,
178
Masz kilka opcji.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10,6))# Make a few areas have NaN values
df.iloc[1:3,1]= np.nan
df.iloc[5,3]= np.nan
df.iloc[7:9,5]= np.nan
Ta odpowiedź jest niepoprawna. Serie Pandy mają ten atrybut, ale DataFrames nie. Jeśli df = DataFrame([1,None], columns=['foo']), to df.hasnansrzuci AttributeError, ale df.foo.hasnanswróci True.
Nathan Thompson
7
Ponieważ muszę pandassię tego dowiedzieć DataFrame.dropna(), przyjrzałem się, jak to zaimplementowali, i odkryłem, że skorzystali DataFrame.count(), co zlicza wszystkie wartości inne niż null w DataFrame. Por. kod źródłowy pandy . Nie przeprowadziłem testów porównawczych tej techniki, ale sądzę, że autorzy biblioteki prawdopodobnie dokonali mądrego wyboru.
Nie, to da Ci Serię, która mapuje nazwy kolumn na ich odpowiednią liczbę wartości NA.
AMC
Poprawione, moja wina: p
Adarsh singh
3
Oto kolejny interesujący sposób znalezienia wartości null i zastąpienia jej wartością obliczoną
#Creating the DataFrame
testdf = pd.DataFrame({'Tenure':[1,2,3,4,5],'Monthly':[10,20,30,40,50],'Yearly':[10,40,np.nan,np.nan,250]})>>> testdf2
MonthlyTenureYearly010110.0120240.02303NaN3404NaN4505250.0#Identifying the rows with empty columns
nan_rows = testdf2[testdf2['Yearly'].isnull()]>>> nan_rows
MonthlyTenureYearly2303NaN3404NaN#Getting the rows# into a list>>> index = list(nan_rows.index)>>> index
[2,3]# Replacing null values with calculated value>>>for i in index:
testdf2['Yearly'][i]= testdf2['Monthly'][i]* testdf2['Tenure'][i]>>> testdf2
MonthlyTenureYearly010110.0120240.0230390.03404160.04505250.0
W zależności od rodzaju danych, z którymi masz do czynienia, możesz również uzyskać zliczenia wartości każdej kolumny podczas wykonywania EDA, ustawiając dropna na False.
for col in df:print df[col].value_counts(dropna=False)
Działa dobrze dla zmiennych jakościowych, nie tak bardzo, gdy masz wiele unikalnych wartości.
Odpowiedzi:
Odpowiedź jwilnera jest natychmiastowa. Badałem, czy jest szybsza opcja, ponieważ z mojego doświadczenia, sumowanie płaskich tablic jest (dziwnie) szybsze niż liczenie. Ten kod wydaje się szybszy:
Na przykład:
df.isnull().sum().sum()
jest nieco wolniejszy, ale oczywiście ma dodatkowe informacje - liczbęNaNs
.źródło
pandas
nie ma do tego wbudowanej funkcji. To prawda, że post @ JGreenwelldf.describe()
może to zrobić, ale nie ma bezpośredniej funkcji.df.describe()
(bez znalezieniaNaN
s). W przypadku tablicy 1000 x 1000 pojedyncze połączenie zajmuje 1,15 sekundy.df.isnull().values.sum()
jest nieco szybszy niżdf.isnull().values.flatten().sum()
.flatten()
plakatu. Dzięki.df.isnull().values.any()
, dla mnie jest szybszy niż inni.Masz kilka opcji.
Teraz ramka danych wygląda mniej więcej tak:
df.isnull().any().any()
- Zwraca wartość logicznąWiesz o tym,
isnull()
która zwróciłaby ramkę danych taką jak ta:Jeśli to zrobisz
df.isnull().any()
, możesz znaleźć tylko kolumny, które mająNaN
wartości:Jeszcze jeden
.any()
powie ci, czy którykolwiek z powyższych jestTrue
df.isnull().sum().sum()
- Zwraca liczbę całkowitą całkowitej liczbyNaN
wartości:Działa to w ten sam sposób, co
.any().any()
robi, najpierw podając sumę liczbyNaN
wartości w kolumnie, a następnie sumując te wartości:Wreszcie, aby uzyskać całkowitą liczbę wartości NaN w DataFrame:
źródło
.any(axis=None)
zamiast.any().any()
?Aby dowiedzieć się, które wiersze zawierają NaN w określonej kolumnie:
źródło
non_nan_rows = df[df['name column'].notnull()]
.Jeśli chcesz wiedzieć, ile wierszy zawiera „jeden lub więcej
NaN
s”:Lub jeśli musisz wyciągnąć te rzędy i zbadać je:
źródło
df.isnull().any().any()
powinien to zrobić.źródło
Dodając do płyty genialną odpowiedź, jestem zupełnie nowy w Pythonie i Pandach, więc proszę wskazać, czy się mylę.
Aby dowiedzieć się, które wiersze mają NaN:
wykonałby tę samą operację bez potrzeby transponowania, określając oś dowolnej () jako 1, aby sprawdzić, czy w wierszach występuje „prawda”.
źródło
any(axis=1)
uproszczenie.Super prosta składnia:
df.isna().any(axis=None)
Począwszy od wersji 0.23.2 , można użyć
DataFrame.isna
+,DataFrame.any(axis=None)
gdzieaxis=None
określa logiczną redukcję w całej ramce danych.Przydatne alternatywy
numpy.isnan
Kolejna wydajna opcja, jeśli korzystasz ze starszych wersji pand.
Ewentualnie sprawdź sumę:
Series.hasnans
Możesz także iteracyjnie zadzwonić
Series.hasnans
. Na przykład, aby sprawdzić, czy pojedyncza kolumna ma NaN,Aby sprawdzić, czy jakakolwiek kolumna ma NaN, możesz skorzystać ze zrozumienia
any
(co jest operacją zwarcia).To jest naprawdę bardzo szybkie.
źródło
Ponieważ żaden z nich nie wspomniał, istnieje tylko jedna zmienna o nazwie
hasnans
.df[i].hasnans
wyświetli się,True
jeśli jedna lub więcej wartości w serii pand to NaN,False
jeśli nie. Zauważ, że to nie jest funkcja.wersja pandy „0.19.2” i „0.20.2”
źródło
df = DataFrame([1,None], columns=['foo'])
, todf.hasnans
rzuciAttributeError
, aledf.foo.hasnans
wróciTrue
.Ponieważ muszę
pandas
się tego dowiedziećDataFrame.dropna()
, przyjrzałem się, jak to zaimplementowali, i odkryłem, że skorzystaliDataFrame.count()
, co zlicza wszystkie wartości inne niż null wDataFrame
. Por. kod źródłowy pandy . Nie przeprowadziłem testów porównawczych tej techniki, ale sądzę, że autorzy biblioteki prawdopodobnie dokonali mądrego wyboru.źródło
niech
df
będzie nazwą Pandas DataFrame i dowolną wartością, która jestnumpy.nan
wartością zerową.Jeśli chcesz zobaczyć procent zerowych wartości w każdej kolumnie
df.loc[:,list(df.loc[:,df.isnull().any()].columns)].isnull().sum()/(len(df))*100
EDYCJA 1:
Jeśli chcesz zobaczyć, gdzie brakuje danych:
źródło
df.isna().sum()
?Wystarczy użyć math.isnan (x) , Zwróć True, jeśli x jest NaN (nie liczbą), a False inaczej.
źródło
math.isnan(x)
zadziała, gdyx
jest ramką DataFrame. Zamiast tego otrzymasz TypeError.To da ci zliczenie wszystkich wartości NaN obecnych w odpowiednich kolorach DataFrame.
źródło
Oto kolejny interesujący sposób znalezienia wartości null i zastąpienia jej wartością obliczoną
źródło
Korzystałem z następujących i wpisz rzut casting na ciąg i sprawdzanie wartości nan
To pozwala mi sprawdzić określoną wartość w serii, a nie tylko zwrócić, jeśli jest ona zawarta gdzieś w serii.
źródło
pandas.isna()
?Najlepiej byłoby użyć:
Oto dlaczego .
isna()
Służy więc do definiowaniaisnull()
, ale oba są oczywiście identyczne.Jest to nawet szybsze niż zaakceptowana odpowiedź i obejmuje wszystkie tablice panda 2D.
źródło
Lub możesz użyć
.info()
naDF
takich jak:df.info(null_counts=True)
która zwraca liczbę niepustych wierszy w kolumnach takich jak:źródło
źródło
Sprawdza dla każdej kolumny, czy zawiera Nan, czy nie.
źródło
Widzimy prezent wartości null w zbiorze danych poprzez generowanie mapę cieplną przy użyciu modułu Seaborn mapę cieplną
źródło
Możesz nie tylko sprawdzić, czy istnieje jakikolwiek „NaN”, ale także uzyskać procent „NaN” w każdej kolumnie, stosując następujące informacje,
źródło
W zależności od rodzaju danych, z którymi masz do czynienia, możesz również uzyskać zliczenia wartości każdej kolumny podczas wykonywania EDA, ustawiając dropna na False.
Działa dobrze dla zmiennych jakościowych, nie tak bardzo, gdy masz wiele unikalnych wartości.
źródło