Cara menghitung nilai NaN di kolom di panda DataFrame


463

Saya memiliki data, di mana saya ingin menemukan jumlah NaN, sehingga jika kurang dari beberapa ambang batas, saya akan menjatuhkan kolom ini. Saya melihat, tetapi tidak dapat menemukan fungsi untuk ini. ada value_counts, tetapi akan lambat bagi saya, karena sebagian besar nilai berbeda dan saya hanya ingin menghitung NaN.

Jawaban:


730

Anda dapat menggunakan isna()metode ini (atau alias isnull()yang juga kompatibel dengan versi panda yang lebih lama <0.21.0) dan kemudian menjumlahkan untuk menghitung nilai NaN. Untuk satu kolom:

In [1]: s = pd.Series([1,2,3, np.nan, np.nan])

In [4]: s.isna().sum()   # or s.isnull().sum() for older pandas versions
Out[4]: 2

Untuk beberapa kolom, ini juga berfungsi:

In [5]: df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})

In [6]: df.isna().sum()
Out[6]:
a    1
b    2
dtype: int64

31
Dan jika Anda ingin jumlah total dfdf.isnull().sum().sum()
nans

2
Untuk mendapatkan colsums .sum(axis=0),, yang merupakan perilaku default. Dan untuk mendapatkan rowsum .sum(axis=1),.
smci

1
@ RockJake28 Ataudf.isnull().values.sum()
cs95

3
df['column_name'].isna().sum()juga berfungsi jika ada yang bertanya-tanya.
Superdooperhero

93

Anda bisa mengurangi total panjang dari hitungan nilai non-nan:

count_nan = len(df) - df.count()

Anda harus mengatur waktu pada data Anda. Untuk Seri kecil mendapat kecepatan 3x dibandingkan dengan isnullsolusinya.


4
Memang, waktu terbaik itu. Itu akan tergantung pada ukuran bingkai saya pikir, dengan bingkai yang lebih besar (3000 baris), menggunakan isnullsudah dua kali lebih cepat karena ini.
Joris

5
Saya mencoba keduanya dalam situasi di mana saya menghitung panjang grup untuk grup besar dengan ukuran grup biasanya <4, dan joris 'df.isnull (). Sum () jumlah () setidaknya 20x lebih cepat. Ini dengan 0.17.1.
Nathan Lloyd

Bagi saya, keduanya berada di bawah 3ms rata-rata untuk 70.000 baris dengan sangat sedikit na.
Josiah Yoder

89

Mari kita asumsikan dfadalah panda DataFrame.

Kemudian,

df.isnull().sum(axis = 0)

Ini akan memberikan jumlah nilai NaN di setiap kolom.

Jika Anda perlu, NaN menghargai di setiap baris,

df.isnull().sum(axis = 1)

46

Berdasarkan jawaban yang paling banyak dipilih, kita dapat dengan mudah mendefinisikan fungsi yang memberi kita kerangka data untuk melihat pratinjau nilai yang hilang dan% dari nilai yang hilang di setiap kolom:

def missing_values_table(df):
        mis_val = df.isnull().sum()
        mis_val_percent = 100 * df.isnull().sum() / len(df)
        mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)
        mis_val_table_ren_columns = mis_val_table.rename(
        columns = {0 : 'Missing Values', 1 : '% of Total Values'})
        mis_val_table_ren_columns = mis_val_table_ren_columns[
            mis_val_table_ren_columns.iloc[:,1] != 0].sort_values(
        '% of Total Values', ascending=False).round(1)
        print ("Your selected dataframe has " + str(df.shape[1]) + " columns.\n"      
            "There are " + str(mis_val_table_ren_columns.shape[0]) +
              " columns that have missing values.")
        return mis_val_table_ren_columns

36

Sejak panda 0.14.1 saran saya di sini untuk memiliki argumen kata kunci dalam metode value_counts telah diterapkan:

import pandas as pd
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})
for col in df:
    print df[col].value_counts(dropna=False)

2     1
 1     1
NaN    1
dtype: int64
NaN    2
 1     1
dtype: int64

Jawaban terbaik sejauh ini, memungkinkan untuk juga menghitung tipe nilai lainnya.
Gaborous

19

jika hanya menghitung nilai nan di kolom panda di sini adalah cara cepat

import pandas as pd
## df1 as an example data frame 
## col1 name of column for which you want to calculate the nan values
sum(pd.isnull(df1['col1']))

2
sushmit, Cara ini tidak terlalu cepat jika Anda memiliki sejumlah kolom. Dalam hal ini, Anda harus menyalin dan menempel / mengetik di setiap nama kolom, lalu menjalankan kembali kode tersebut.
Amos Long

17

jika Anda menggunakan Jupyter Notebook, Bagaimana ....

 %%timeit
 df.isnull().any().any()

atau

 %timeit 
 df.isnull().values.sum()

atau, apakah ada di mana saja NaN dalam data, jika ya, di mana?

 df.isnull().any()

13

Di bawah ini akan mencetak semua kolom Nan dalam urutan menurun.

df.isnull().sum().sort_values(ascending = False)

atau

Di bawah ini akan mencetak 15 kolom Nan pertama dalam urutan menurun.

df.isnull().sum().sort_values(ascending = False).head(15)

10
import numpy as np
import pandas as pd

raw_data = {'first_name': ['Jason', np.nan, 'Tina', 'Jake', 'Amy'], 
        'last_name': ['Miller', np.nan, np.nan, 'Milner', 'Cooze'], 
        'age': [22, np.nan, 23, 24, 25], 
        'sex': ['m', np.nan, 'f', 'm', 'f'], 
        'Test1_Score': [4, np.nan, 0, 0, 0],
        'Test2_Score': [25, np.nan, np.nan, 0, 0]}
results = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'sex', 'Test1_Score', 'Test2_Score'])

results 
'''
  first_name last_name   age  sex  Test1_Score  Test2_Score
0      Jason    Miller  22.0    m          4.0         25.0
1        NaN       NaN   NaN  NaN          NaN          NaN
2       Tina       NaN  23.0    f          0.0          NaN
3       Jake    Milner  24.0    m          0.0          0.0
4        Amy     Cooze  25.0    f          0.0          0.0
'''

Anda dapat menggunakan fungsi berikut, yang akan memberi Anda output dalam Dataframe

  • Nilai Nol
  • Nilai yang hilang
  • % dari Total Nilai
  • Nilai Nol Total Hilang
  • % Total Nilai Nol Hilang
  • Tipe data

Cukup salin dan tempel fungsi berikut dan panggil dengan melewati pfr Dataframe Anda

def missing_zero_values_table(df):
        zero_val = (df == 0.00).astype(int).sum(axis=0)
        mis_val = df.isnull().sum()
        mis_val_percent = 100 * df.isnull().sum() / len(df)
        mz_table = pd.concat([zero_val, mis_val, mis_val_percent], axis=1)
        mz_table = mz_table.rename(
        columns = {0 : 'Zero Values', 1 : 'Missing Values', 2 : '% of Total Values'})
        mz_table['Total Zero Missing Values'] = mz_table['Zero Values'] + mz_table['Missing Values']
        mz_table['% Total Zero Missing Values'] = 100 * mz_table['Total Zero Missing Values'] / len(df)
        mz_table['Data Type'] = df.dtypes
        mz_table = mz_table[
            mz_table.iloc[:,1] != 0].sort_values(
        '% of Total Values', ascending=False).round(1)
        print ("Your selected dataframe has " + str(df.shape[1]) + " columns and " + str(df.shape[0]) + " Rows.\n"      
            "There are " + str(mz_table.shape[0]) +
              " columns that have missing values.")
#         mz_table.to_excel('D:/sampledata/missing_and_zero_values.xlsx', freeze_panes=(1,0), index = False)
        return mz_table

missing_zero_values_table(results)

Keluaran

Your selected dataframe has 6 columns and 5 Rows.
There are 6 columns that have missing values.

             Zero Values  Missing Values  % of Total Values  Total Zero Missing Values  % Total Zero Missing Values Data Type
last_name              0               2               40.0                          2                         40.0    object
Test2_Score            2               2               40.0                          4                         80.0   float64
first_name             0               1               20.0                          1                         20.0    object
age                    0               1               20.0                          1                         20.0   float64
sex                    0               1               20.0                          1                         20.0    object
Test1_Score            3               1               20.0                          4                         80.0   float64

Jika Anda ingin tetap sederhana maka Anda dapat menggunakan fungsi berikut untuk mendapatkan nilai yang hilang dalam%

def missing(dff):
    print (round((dff.isnull().sum() * 100/ len(dff)),2).sort_values(ascending=False))


missing(results)
'''
Test2_Score    40.0
last_name      40.0
Test1_Score    20.0
sex            20.0
age            20.0
first_name     20.0
dtype: float64
'''

10

Untuk menghitung nol:

df[df == 0].count(axis=0)

Untuk menghitung NaN:

df.isnull().sum()

atau

df.isna().sum()

8

Anda dapat menggunakan metode value_counts dan mencetak nilai np.nan

s.value_counts(dropna = False)[np.nan]

Bagus! Ini adalah yang paling berguna jika Anda ingin menghitung NaN dan non-NaN. s.value_counts(dropna = False)
icemtel

8

Silakan gunakan di bawah ini untuk jumlah kolom tertentu

dataframe.columnName.isnull().sum()


3

Berikut adalah kode untuk menghitung Nullkolom nilai bijak:

df.isna().sum()

3

Ada artikel Dzone bagus dari Juli 2017 yang merinci berbagai cara meringkas nilai-nilai NaN. Lihat di sini .

Artikel yang saya kutip memberikan nilai tambahan dengan: (1) Menampilkan cara untuk menghitung dan menampilkan jumlah NaN untuk setiap kolom sehingga orang dapat dengan mudah memutuskan apakah akan membuang kolom tersebut dan (2) Mendemonstrasikan cara untuk memilih baris di spesifik yang memiliki NaN sehingga dapat dibuang secara selektif atau diperhitungkan.

Berikut adalah contoh cepat untuk menunjukkan kegunaan dari pendekatan ini - dengan hanya beberapa kolom mungkin kegunaannya tidak jelas tetapi saya menemukan itu dapat membantu untuk kerangka data yang lebih besar.

import pandas as pd
import numpy as np

# example DataFrame
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})

# Check whether there are null values in columns
null_columns = df.columns[df.isnull().any()]
print(df[null_columns].isnull().sum())

# One can follow along further per the cited article

3

Satu opsi sederhana lain yang belum disarankan, untuk hanya menghitung NaN, akan menambahkan dalam bentuk untuk mengembalikan jumlah baris dengan NaN.

df[df['col_name'].isnull()]['col_name'].shape

2

df.isnull (). sum () akan memberikan jumlah kolom-nilai yang hilang.

Jika Anda ingin mengetahui jumlah nilai yang hilang di kolom tertentu maka kode berikut akan berfungsi df.column.isnull (). Sum ()


1

berdasarkan jawaban yang diberikan dan beberapa perbaikan inilah pendekatan saya

def PercentageMissin(Dataset):
    """this function will return the percentage of missing values in a dataset """
    if isinstance(Dataset,pd.DataFrame):
        adict={} #a dictionary conatin keys columns names and values percentage of missin value in the columns
        for col in Dataset.columns:
            adict[col]=(np.count_nonzero(Dataset[col].isnull())*100)/len(Dataset[col])
        return pd.DataFrame(adict,index=['% of missing'],columns=adict.keys())
    else:
        raise TypeError("can only be used with panda dataframe")

Saya lebih sukadf.apply(lambda x: x.value_counts(dropna=False)[np.nan]/x.size*100)
K.-Michael Aye

1

Jika Anda perlu menghitung non-NA (non-None) dan NA (None) di semua grup berbeda yang ditarik oleh groupby:

gdf = df.groupby(['ColumnToGroupBy'])

def countna(x):
    return (x.isna()).sum()

gdf.agg(['count', countna, 'size'])

Ini mengembalikan jumlah non-NA, NA dan jumlah total entri per grup.


0

Menggunakan solusi yang diusulkan oleh @sushmit dalam kode saya.

Variasi yang mungkin sama juga dapat terjadi

colNullCnt = []
for z in range(len(df1.cols)):
    colNullCnt.append([df1.cols[z], sum(pd.isnull(trainPd[df1.cols[z]]))])

Keuntungan dari ini adalah bahwa ia mengembalikan hasil untuk setiap kolom di df selanjutnya.


0
import pandas as pd
import numpy as np

# example DataFrame
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})

# count the NaNs in a column
num_nan_a = df.loc[ (pd.isna(df['a'])) , 'a' ].shape[0]
num_nan_b = df.loc[ (pd.isna(df['b'])) , 'b' ].shape[0]

# summarize the num_nan_b
print(df)
print(' ')
print(f"There are {num_nan_a} NaNs in column a")
print(f"There are {num_nan_b} NaNs in column b")

Memberikan sebagai output:

     a    b
0  1.0  NaN
1  2.0  1.0
2  NaN  NaN

There are 1 NaNs in column a
There are 2 NaNs in column b

0

Misalkan Anda ingin mendapatkan jumlah nilai yang hilang (NaN) dalam kolom (seri) yang dikenal sebagai harga dalam kerangka data yang disebut ulasan

#import the dataframe
import pandas as pd

reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)

Untuk mendapatkan nilai yang hilang, dengan n_missing_prices sebagai variabel, do sederhana

n_missing_prices = sum(reviews.price.isnull())
print(n_missing_prices)

jumlah adalah metode utama di sini, mencoba menggunakan hitungan sebelum saya menyadari jumlah adalah metode yang tepat untuk digunakan dalam konteks ini



-1

Untuk tugas Anda, Anda dapat menggunakan pandas.DataFrame.dropna ( https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html ):

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1, 2, 3, 4, np.nan],
                   'b': [1, 2, np.nan, 4, np.nan],
                   'c': [np.nan, 2, np.nan, 4, np.nan]})
df = df.dropna(axis='columns', thresh=3)

print(df)

Dengan parameter ambang Anda dapat mendeklarasikan jumlah maks untuk nilai NaN untuk semua kolom di DataFrame.

Keluaran kode:

     a    b
0  1.0  1.0
1  2.0  2.0
2  3.0  NaN
3  4.0  4.0
4  NaN  NaN
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.