web-dev-qa-db-ja.com

Pandasデータフレームのどの列にNaN値が含まれているかを調べる方法(python)

あちこちに散らばっている(多分)NaN値を含むパンダデータフレームを考えます。

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

ありがとうございました

90
denvar

更新: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
158
MaxU

df.isnull().sum()を使うことができます。すべての列と各機能の合計NaNが表示されます。

19
Matheus

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

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

それが誰かに役立つなら

1
Tom Wattley

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

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

どちらもうまくいくはずです。

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

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

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

0
prosti