programing

Panda DataFrame에서 NaN 값이 있는지 확인하는 방법

projobs 2022. 9. 25. 10:57
반응형

Panda DataFrame에서 NaN 값이 있는지 확인하는 방법

Python Panda에서 DataFrame에 하나 이상의 NaN 값이 있는지 확인하는 가장 좋은 방법은 무엇입니까?

는 그 알고 있습니다.pd.isnan단, 각 요소에 대한 부란의 DataFrame을 반환합니다.여기 이 게시물도 제 질문에 정확히 답하지 않습니다.

Jwilner의 반응은 정확합니다.플랫 어레이의 합계가 계산보다 (이상하게) 빠르기 때문에 더 빠른 옵션이 없는지 알아보고 있었습니다.이 코드가 더 빠른 것 같습니다.

df.isnull().values.any()

여기에 이미지 설명 입력

import numpy as np
import pandas as pd
import perfplot


def setup(n):
    df = pd.DataFrame(np.random.randn(n))
    df[df > 0.9] = np.nan
    return df


def isnull_any(df):
    return df.isnull().any()


def isnull_values_sum(df):
    return df.isnull().values.sum() > 0


def isnull_sum(df):
    return df.isnull().sum() > 0


def isnull_values_any(df):
    return df.isnull().values.any()


perfplot.save(
    "out.png",
    setup=setup,
    kernels=[isnull_any, isnull_values_sum, isnull_sum, isnull_values_any],
    n_range=[2 ** k for k in range(25)],
)

df.isnull().sum().sum()느리지만,: of느 、 론 of 、 론 is 、 is is 、 is is is is is is is 。NaNs.

몇 가지 옵션이 있습니다.

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

데이터 프레임은 다음과 같습니다.

          0         1         2         3         4         5
0  0.520113  0.884000  1.260966 -0.236597  0.312972 -0.196281
1 -0.837552       NaN  0.143017  0.862355  0.346550  0.842952
2 -0.452595       NaN -0.420790  0.456215  1.203459  0.527425
3  0.317503 -0.917042  1.780938 -1.584102  0.432745  0.389797
4 -0.722852  1.704820 -0.113821 -1.466458  0.083002  0.011722
5 -0.622851 -0.251935 -1.498837       NaN  1.098323  0.273814
6  0.329585  0.075312 -0.690209 -3.807924  0.489317 -0.841368
7 -1.123433 -1.187496  1.868894 -2.046456 -0.949718       NaN
8  1.133880 -0.110447  0.050385 -1.158387  0.188222       NaN
9 -0.513741  1.196259  0.704537  0.982395 -0.585040 -1.693810
  • 옵션 1:df.isnull().any().any() - 을 합니다.

알고 계시죠?isnull()다음과 같은 데이터 프레임을 반환합니다.

       0      1      2      3      4      5
0  False  False  False  False  False  False
1  False   True  False  False  False  False
2  False   True  False  False  False  False
3  False  False  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False   True  False  False
6  False  False  False  False  False  False
7  False  False  False  False  False   True
8  False  False  False  False  False   True
9  False  False  False  False  False  False

df.isnull().any() , , , , , , , , 이 .NaN§:

0    False
1     True
2    False
3     True
4    False
5     True
dtype: bool

더 ★★★.any()상기 중 하나가 다음 중 하나일 경우 알려드립니다.True

> df.isnull().any().any()
True
  • 옵션 2:df.isnull().sum().sum()이은 - 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,NaN§:

동작은 이 동작과 합니다..any().any()먼저 하겠습니다.NaN하다

df.isnull().sum()
0    0
1    2
2    0
3    1
4    0
5    2
dtype: int64

마지막으로 DataFrame의 NaN 값의 총수를 얻으려면 다음 절차를 수행합니다.

df.isnull().sum().sum()
5

특정 컬럼에 NaN이 있는 행을 확인하려면 다음 절차를 수행합니다.

nan_rows = df[df['name column'].isnull()]

''이 있는 이 몇 .NaNs":

df.isnull().T.any().T.sum()

또는 다음 행을 꺼내 조사할 필요가 있는 경우:

nan_rows = df[df.isnull().T.any()]

df.isnull().any().any()아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 네.

Syntax: " " " " " super 。df.isna().any(axis=None)

v0.23.2부터는 + 를 사용할 수 있습니다.axis=Noneframe Data Frame 전체frame전 。

# Setup
df = pd.DataFrame({'A': [1, 2, np.nan], 'B' : [np.nan, 4, 5]})
df
     A    B
0  1.0  NaN
1  2.0  4.0
2  NaN  5.0

df.isna()

       A      B
0  False   True
1  False  False
2   True  False

df.isna().any(axis=None)
# True

편리한 대체 수단

numpy.isnan
오래된 버전의 판다라면 또 다른 성능 옵션입니다.

np.isnan(df.values)

array([[False,  True],
       [False, False],
       [ True, False]])

np.isnan(df.values).any()
# True

또는 합계를 확인합니다.

np.isnan(df.values).sum()
# 2

np.isnan(df.values).sum() > 0
# True

Series.hasnans
해서 '아, 아, 이렇게 불러도 돼요.Series.hasnansNaN이 여부를 하려면 , 「NaN」을 사용합니다

df['A'].hasnans
# True

또한 컬럼에 NaN이 포함되어 있는지 여부를 확인하려면 다음과 같이 해석하면 됩니다.any(일부러)

any(df[c].hasnans for c in df)
# True

이것은 사실 매우 빠르다.

Hobs의 훌륭한 답변에 덧붙여, 저는 Python과 Panda를 처음 접하는 사람이기 때문에 틀렸다면 지적해 주세요.

NaN이 있는 행을 확인하려면 다음 절차를 따릅니다.

nan_rows = df[df.isnull().any(1)]

any()의 축을 1로 지정하여 행에 'True'가 존재하는지 여부를 확인함으로써 이전할 필요 없이 동일한 작업을 수행합니다.

허락하다dfPanda DataFrame의 이름 및 모든 가치numpy.nan는 늘값입니다.

  1. null이 있는 열과 null이 없는 열(True 및 False만)을 표시하는 경우

    df.isnull().any()
    
  2. null이 있는 열만 표시하려면

    df.loc[:, df.isnull().any()].columns
    
  3. 모든 열의 null 수를 표시하려면

    df.isna().sum()
    
  4. 모든 컬럼의 null 비율을 표시하는 경우

    df.isna().sum()/(len(df))*100
    
  5. Null이 있는 열에만 Null의 백분율을 표시하는 경우:

df.loc[:,list(df.loc[:,df.isnull().any()].columns)].isnull().sum()/(len(df))*100

편집 1:

데이터가 누락된 위치를 시각적으로 확인하려면:

import missingno
missingdata_df = df.columns[df.isnull().any()].tolist()
missingno.matrix(df[missingdata_df])

아무도 언급하지 않았기 때문에, 라고 하는 또 다른 변수가 있습니다.hasnans.

df[i].hasnans에 출력합니다.True팬더 시리즈의 값 중 하나 이상이 NaN이면False아니라면.이 기능은 기능하지 않습니다.

판다 버전 '0.19'2'와 0.20.2'

부터pandas이것을 위해 알아내야 한다DataFrame.dropna()그들이 어떻게 그것을 구현하는지 살펴봤더니, 그들이 그것을 사용하고 있다는 것을 알게 되었다.DataFrame.count()이 값은 에 포함된 모든 비표준 값을 카운트합니다.DataFrame팬더 소스코드 참조저는 이 기술을 벤치마킹하지는 않았지만, 도서관의 저자들이 그것을 어떻게 할 것인지에 대해 현명한 선택을 했을 것이라고 생각합니다.

나는 다음을 사용하고 그것을 끈에 던져 nan 값을 확인합니다.

   (str(df.at[index, 'column']) == 'nan')

이를 통해 시리즈 내의 특정 값을 확인할 수 있으며, 시리즈 내의 특정 값이 포함된 경우만 반환되는 것이 아닙니다.

df.isnull().sum()

그러면 DataFrame의 각 컬럼에 존재하는 모든 NaN 값이 카운트됩니다.

math.isnan(x), x가 NaN(숫자가 아님)이면 True를 반환하고, 그렇지 않으면 False를 사용합니다.

다음을 시도하다

df.isnull().sum()

또는

df.isna().values.any()

null을 찾아 계산된 값으로 대체하는 또 다른 흥미로운 방법이 있습니다.

    #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
       Monthly  Tenure  Yearly
    0       10       1    10.0
    1       20       2    40.0
    2       30       3     NaN
    3       40       4     NaN
    4       50       5   250.0

    #Identifying the rows with empty columns
    nan_rows = testdf2[testdf2['Yearly'].isnull()]
    >>> nan_rows
       Monthly  Tenure  Yearly
    2       30       3     NaN
    3       40       4     NaN

    #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
       Monthly  Tenure  Yearly
    0       10       1    10.0
    1       20       2    40.0
    2       30       3    90.0
    3       40       4   160.0
    4       50       5   250.0

seaborn 모듈 히트맵을 사용하여 히트맵을 생성함으로써 데이터셋에 존재하는 null 값을 확인할 수 있습니다.

import pandas as pd
import seaborn as sns
dataset=pd.read_csv('train.csv')
sns.heatmap(dataset.isnull(),cbar=False)

다음을 사용하는 것이 가장 좋습니다.

df.isna().any().any()

이유는 이렇다.그렇게isna()를 정의하기 위해 사용됩니다.isnull()물론 둘 다 똑같습니다.

이는 승인된 답변보다 더 빠른 속도이며 모든 2D 판다 어레이를 포함합니다.

이렇게 하려면 다음 명령어를 사용합니다.df.isna().any()그러면 모든 컬럼이 체크되고 반환됩니다.True결측값이 있는 경우NaN또는False결측값이 없는 경우.

또는 를 사용할 수 있습니다..info()에서DF예를 들어 다음과 같습니다.

df.info(null_counts=True)다음과 같은 열의 non_nUll 행 수를 반환합니다.

<class 'pandas.core.frame.DataFrame'>
Int64Index: 3276314 entries, 0 to 3276313
Data columns (total 10 columns):
n_matches                          3276314 non-null int64
avg_pic_distance                   3276314 non-null float64
import missingno as msno
msno.matrix(df)  # just to visualize. no missing value.

여기에 이미지 설명 입력

은 '하다'입니다.dropna:가가:가 、 :: 、 :: 、 。

>>> len(df.dropna()) != len(df)
True
>>> 

어레이에 대한 평가가 훨씬 빠르기 때문에 값 속성을 사용하는 것이 좋습니다.

arr = np.random.randn(100, 100)
arr[40, 40] = np.nan
df = pd.DataFrame(arr)

%timeit np.isnan(df.values).any()  # 7.56 µs
%timeit np.isnan(df).any()         # 627 µs
%timeit df.isna().any(axis=None)   # 572 µs

결과:

7.56 µs ± 447 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
627 µs ± 40.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
572 µs ± 15.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

의: 행야야합합합합 note note note note note note를 실행해야 .%timeitJupyter 노트북으로 작업합니다.

df.apply(axis=0, func=lambda x : any(pd.isnull(x)))

각 컬럼에 Nan이 포함되어 있는지 확인합니다.

다음을 사용하여 'NaN'이 존재하는지 확인할 수 있을 뿐만 아니라 각 열에 있는 'NaN'의 비율도 확인할 수 있습니다.

df = pd.DataFrame({'col1':[1,2,3,4,5],'col2':[6,np.nan,8,9,10]})  
df  

   col1 col2  
0   1   6.0  
1   2   NaN  
2   3   8.0  
3   4   9.0  
4   5   10.0  


df.isnull().sum()/len(df)  
col1    0.0  
col2    0.2  
dtype: float64

결측값에 대한 막대 표현

import missingno
missingno.bar(df)# will give you exact no of values and values missing

취급하는 데이터의 유형에 따라서는 dropna를 False로 설정하여 EDA를 실행하는 동안 각 열의 값만 얻을 수도 있습니다.

for col in df:
   print df[col].value_counts(dropna=False)

범주형 변수에는 잘 작동하지만 고유 값이 많은 경우에는 잘 작동하지 않습니다.

언급URL : https://stackoverflow.com/questions/29530232/how-to-check-if-any-value-is-nan-in-a-pandas-dataframe

반응형