Cara menemukan kolom mana yang berisi nilai NaN apa pun dalam kerangka data Pandas

144

Diberikan kerangka data panda berisi kemungkinan nilai NaN yang tersebar di sana-sini:

Pertanyaan: Bagaimana cara menentukan kolom mana yang berisi nilai NaN? Secara khusus, dapatkah saya mendapatkan daftar nama kolom yang berisi NaN?

denvar
sumber
5
df.isna().any()[lambda x: x]bekerja untuk saya
matanster

Jawaban:

249

PEMBARUAN: menggunakan Pandas 0.22.0

Versi Pandas yang lebih baru memiliki metode baru 'DataFrame.isna ()' dan '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

sebagai daftar kolom:

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

untuk memilih kolom tersebut (mengandung setidaknya satu NaNnilai):

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

Jawaban LAMA:

Coba gunakan 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

atau seperti @root usulkan versi yang lebih jelas:

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']

untuk memilih subset - semua kolom yang mengandung setidaknya satu NaNnilai:

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
MaxU
sumber
Terima kasih atas tanggapannya! Saya mencari daftar nama kolom (saya memperbarui pertanyaan saya sesuai), apakah Anda tahu caranya?
denvar
Apakah Anda tahu cara yang baik untuk memilih semua kolom dengan nilai tertentu dan bukan nilai nol?
gregorio099
1
Lupakan! Cukup ganti .isnull () dengan .isin (['xxx']) untuk mencari nilai alih-alih nol:df.columns[df.isin['xxx'].any()].tolist()
gregorio099
@ gregorio099, saya akan melakukannya dengan cara ini:df.columns[df.eq(search_for_value).any()].tolist()
MaxU
1
Jawaban yang bagus, sudah ter-upgrade. Idea - Anda dapat menambahkan fungsi baru isna, notna ?
jezrael
26

Anda bisa menggunakannya df.isnull().sum(). Ini menunjukkan semua kolom dan total NaNs dari setiap fitur.

Matheus
sumber
9

Saya mempunyai masalah di mana saya harus memeriksa banyak kolom secara visual di layar sehingga daftar pendek yang menyaring dan mengembalikan kolom yang menyinggung adalah

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

jika itu bermanfaat bagi siapa pun

Tom Wattley
sumber
4

Dalam kumpulan data yang memiliki jumlah kolom yang besar, lebih baik untuk melihat berapa banyak kolom yang berisi nilai nol dan berapa banyak yang tidak.

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))

Sebagai contoh dalam dataframe saya itu berisi 82 ​​kolom, dimana 19 berisi setidaknya satu nilai nol.

Selanjutnya Anda juga dapat secara otomatis menghapus cols dan rows bergantung pada yang memiliki lebih banyak nilai null
Berikut adalah kode yang melakukan ini dengan cerdas:

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

Catatan: Kode di atas menghapus semua nilai nol Anda. Jika Anda ingin nilai nol, proses sebelumnya.

Pradeep Singh
sumber
2

saya menggunakan tiga baris kode ini untuk mencetak nama kolom yang mengandung setidaknya satu nilai nol:

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

Keduanya harus berfungsi:

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

Metode DataFrame isna()atauisnull() sepenuhnya identik.

Catatan : String kosong ''dianggap False (tidak dianggap NA)

prosti
sumber
1

Ini berhasil untuk saya,

1. Untuk mendapatkan Kolom yang memiliki setidaknya 1 nilai nol. (nama kolom)

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

2. Untuk mendapatkan Kolom dengan jumlah, dengan memiliki setidaknya 1 nilai nol.

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

[Opsional] 3. Untuk mendapatkan persentase jumlah nol.

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
Uday Kiran
sumber
Terima kasih atas berbagai pendekatan!
Mike Rapadas