webdevqa.jp.net

Pandas DataFrameで値がNaNかどうかを確認する方法

Python Pandasでは、DataFrameに1つ(または複数)のNaN値があるかどうかを確認するための最良の方法は何ですか?

関数pd.isnanについては知っていますが、これは各要素についてブール値のDataFrameを返します。 この記事 まさにここで私の質問に正確に答えていない。

323
hlin117

jwilner の応答が注目を集めています。私の経験では、フラット配列を合計するほうがカウントするより(奇妙に)速いので、私はもっと速いオプションがあるかどうかを調べていました。このコードは速いようです:

df.isnull().values.any()

例えば:

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()は少し遅くなりますが、もちろん、追加情報 - NaNsの数があります。

405
S Anand

いくつかの選択肢があります。 

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

上記のどれかがTrueであれば、もう1つ.any()が教えてくれます。

> 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
126
Andy

特定の列にNaNが含まれている行を調べるには、次の手順を実行します。

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

"1つ以上のNaNs"を使用して行数を知る必要がある場合

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

あるいは、これらの行を取り出して調べなければならない場合は、次のようにします。

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

df.isnull().any().any()はそれをするべきです。

27
jwilner

Hobsの素晴らしい答えに加えて、私はPythonとPandasにはとても初心者なので、間違っていたら指摘してください。

どの行にNaNがあるかを調べるには、次の手順を実行します。

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

any()の軸を1に指定して、行に 'True'が含まれているかどうかを確認することによって、転置を必要とせずに同じ操作を実行します。 

14
Ankit

何も言及していないので、hasnansと呼ばれるただ一つの変数があります。 

df[i].hasnansは、パンダ系列の1つ以上の値がNaNの場合はTrueに出力し、そうでない場合はFalseを出力します。それは機能ではないことに注意してください。

パンダバージョン '0.19.2'と '0.20.2'

10
yazhi

pandasDataFrame.dropna()のためにこれを見つけなければならないので、私は彼らがそれをどのように実装するかを見るために調べて、彼らがDataFrameのすべての非null値を数えるDataFrame.count()を利用したことを発見しました。比較 パンダのソースコード 。私はこのテクニックをベンチマークしていませんが、私はライブラリの作者がそれを行う方法について賢い選択をした可能性が高いと思います。

7

math.isnan(x) を使用するだけで、xがNaN(数値ではない)の場合はTrueを返し、それ以外の場合はFalseを返します。

4
江南消夏

v0.23.2 から、 DataFrame.isna + DataFrame.any(axis=None) を使用できます。ここで、axis=Noneは、DataFrame全体の論理的な縮小を指定します。

# 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 を繰り返し呼び出すこともできます。たとえば、単一の列にNaNがあるかどうかを確認するには、 

df['A'].hasnans
# True

また、 any 列にNaNがあるかどうかを確認するには、anyを使用した内包表記を使用できます(これは短絡操作です)。

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

これは実際には very fastです。

2
coldspeed

これは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
2

あるいは、DF.info()を使用することもできます。

次のような列に含まれるnon_null行の数を返すdf.info(null_counts=True)

<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
1
Jan Sila

dfをPandas DataFrameの名前とし、numpy.nanである値はすべてnull値です。

  1. どの列にヌルがあり、どの列にないかを確認する場合(TrueとFalseのみ)
    df.isnull().any()
  2. NULLのある列のみを表示する場合
    df.loc[:, df.isnull().any()].columns
  3. 列のヌルの数を確認したい場合
    df.loc[:, list(df.loc[:, df.isnull().any()].columns)].isnull().sum()
  4. 列のヌルの割合を確認する場合
    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])

1
Naveen Kumar

私は以下を使ってそれを文字列にキャストしてnan値をチェックしています

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

これは、シリーズ内の特定の値をチェックすることを可能にし、これがシリーズ内のどこかに含まれている場合に返すだけではありません。

1
Peter Thomas

最善の方法は次のとおりです。

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

これが なぜ です。そのためisna()isnull()を定義するために使用されますが、これらは両方とももちろん同一です。

これは一般に認められている答えよりもさらに速く、すべての2Dパンダ配列を網羅しています。

0
prosti
import missingno as msno
msno.matrix(df)  # just to visualize. no missing value.

enter image description here

0

df.isnull()。sum()これにより、DataFrame内のすべてのNaN値のカウントが得られます。

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

Nanが含まれているかどうかは各列を確認します。

0
Alex Dlikman

扱うデータの種類によっては、dropnaをFalseに設定することで、EDAの実行中に各列の値カウントを取得することもできます。 

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

カテゴリカル変数に適していますが、一意の値が多数ある場合はそれほど多くはありません。

0
andrewwowens