PandasデータフレームでNaN値を含む列を見つける方法


144

あちこちに散らばっている可能性のあるNaN値を含むpandasデータフレームがあるとします。

質問:どの列にNaN値が含まれるかを判断するにはどうすればよいですか?特に、NaNを含む列名のリストを取得できますか?


5
df.isna().any()[lambda x: x]私のために働く
マタンスター

回答:


249

更新: Pandas 0.22.0の使用

新しいPandasバージョンには、新しいメソッド'DataFrame.isna()'および'DataFrame.notna()'があります。

In [71]: df
Out[71]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [72]: df.isna().any()
Out[72]:
a     True
b     True
c    False
dtype: bool

列のリストとして:

In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']

それらの列を選択するには(少なくとも1つのNaN値を含む):

In [73]: df.loc[:, df.isna().any()]
Out[73]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

古い答え:

isnull()を使用してみてください:

In [97]: df
Out[97]:
     a    b  c
0  NaN  7.0  0
1  0.0  NaN  4
2  2.0  NaN  4
3  1.0  7.0  0
4  1.0  3.0  9
5  7.0  4.0  9
6  2.0  6.0  9
7  9.0  6.0  4
8  3.0  0.0  9
9  9.0  0.0  1

In [98]: pd.isnull(df).sum() > 0
Out[98]:
a     True
b     True
c    False
dtype: bool

または@rootがより明確なバージョンを提案したように:

In [5]: df.isnull().any()
Out[5]:
a     True
b     True
c    False
dtype: bool

In [7]: df.columns[df.isnull().any()].tolist()
Out[7]: ['a', 'b']

サブセットを選択するには-少なくとも1つのNaN値を含むすべての列:

In [31]: df.loc[:, df.isnull().any()]
Out[31]:
     a    b
0  NaN  7.0
1  0.0  NaN
2  2.0  NaN
3  1.0  7.0
4  1.0  3.0
5  7.0  4.0
6  2.0  6.0
7  9.0  6.0
8  3.0  0.0
9  9.0  0.0

回答ありがとうございます!列名のリストを取得しようとしています(それに応じて質問を更新しました)。方法はわかりますか?
denvar 2016年

null値ではなく特定の値を持つすべての列を選択する良い方法を知っていますか?
gregorio099 2017年

1
気にしないで!単に代わりにヌルの値を検索する([ 'XXX']).isinで().isnull置き換える:df.columns[df.isin['xxx'].any()].tolist()
gregorio099

@ gregorio099、私はこのようにします:df.columns[df.eq(search_for_value).any()].tolist()
MaxU

1
正解です。すでに賛成しています。アイデア-あなたが新しい機能を追加することができisnanotna
jezrael

26

使用できますdf.isnull().sum()。すべての列と各特徴の合計NaNが表示されます。


9

画面で視覚的に検査するために多くの列を使わなければならないという問題があったので、問題の列をフィルタリングして返す短いリストコンプが

nan_cols = [i for i in df.columns if df[i].isnull().any()]

それが誰かに役立つなら


4

列の数が多いデータセットでは、null値を含む列の数と含まない列の数を確認することをお勧めします。

print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))

print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))

print("Total no. of columns in the dataframe")
print(len(df.columns))

たとえば、私のデータフレームには82列が含まれており、そのうちの19列には少なくとも1つのnull値が含まれていました。

さらに、null値の多いものに応じて、列と行を自動的に削除することもでき
ます。これは、これをインテリジェントに行うコードです。

df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)

注:上記のコードは、すべてのnull値を削除します。null値が必要な場合は、前にそれらを処理します。


2

次の3行のコードを使用して、少なくとも1つのnull値を含む列名を出力します。

for column in dataframe:
    if dataframe[column].isnull().any():
       print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))

2

これらはどちらも機能するはずです。

df.isnull().sum()
df.isna().sum()

DataFrameメソッドisna()またはisnull()は完全に同一です。

:空の文字列''はFalseと見なされます(NAとは見なされません)


1

これは私のために働いた、

1.少なくとも1つのnull値を持つ列を取得します。(列名)

data.columns[data.isnull().any()]

2.少なくとも1つのnull値を持つ、カウント付きの列を取得するため。

data[data.columns[data.isnull().any()]].isnull().sum()

[オプション] 3. nullカウントのパーセンテージを取得します。

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]

複数のアプローチをありがとう!
Mike Rapadas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.