Cách đếm các giá trị NaN trong một cột trong DataFrame của gấu trúc


460

Tôi có dữ liệu, trong đó tôi muốn tìm số lượng NaN, để nếu nó nhỏ hơn ngưỡng nào đó, tôi sẽ bỏ cột này. Tôi đã xem, nhưng không thể tìm thấy bất kỳ chức năng nào cho việc này. có value_counts, nhưng nó sẽ chậm đối với tôi, bởi vì hầu hết các giá trị là khác biệt và tôi chỉ muốn đếm NaN.

Câu trả lời:


729

Bạn có thể sử dụng isna()phương thức (hoặc đó là bí danh isnull()cũng tương thích với các phiên bản gấu trúc cũ <0.21.0) và sau đó tính tổng để đếm các giá trị NaN. Đối với một cột:

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

Đối với một số cột, nó cũng hoạt động:

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
Và nếu bạn muốn tổng số lượng nans trong toàn bộ dfbạn có thể sử dụngdf.isnull().sum().sum()
RockJake28

2
Để có được colsums, .sum(axis=0)đó là hành vi mặc định. Và để có được hàng , .sum(axis=1).
smci

1
@ RockJake28 Hoặcdf.isnull().values.sum()
cs95

3
df['column_name'].isna().sum()cũng hoạt động nếu bất cứ ai đang tự hỏi.
Siêu anh hùng

93

Bạn có thể trừ tổng chiều dài từ số lượng giá trị không phải là nan:

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

Bạn nên dành thời gian cho dữ liệu của bạn. Đối với Sê-ri nhỏ có tốc độ tăng gấp 3 lần so với isnullgiải pháp.


4
Thật vậy, thời gian tốt nhất nó. Nó sẽ phụ thuộc vào kích thước của khung tôi nghĩ, với khung lớn hơn (3000 hàng), việc sử dụng isnullđã nhanh hơn hai lần như thế này.
joris

5
Tôi đã thử cả hai cách trong tình huống tôi đang đếm chiều dài của nhóm cho một nhóm lớn trong đó kích thước nhóm thường <4 và joris 'df.isnull (). Sum () nhanh hơn ít nhất 20 lần. Điều này là với 0.17.1.
Nathan Lloyd

Đối với tôi, cả hai đều dưới 3ms trung bình cho 70.000 hàng với rất ít na.
Josiah Yoder

89

Giả sử dflà DataFrame của gấu trúc.

Sau đó,

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

Điều này sẽ cho số lượng giá trị NaN trong mỗi cột.

Nếu bạn cần, giá trị NaN ở mỗi hàng,

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

46

Dựa trên câu trả lời được bình chọn nhiều nhất, chúng ta có thể dễ dàng xác định hàm cung cấp cho chúng ta khung dữ liệu để xem trước các giá trị bị thiếu và% giá trị bị thiếu trong mỗi cột:

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

Vì gấu trúc 0.14.1, đề xuất của tôi ở đây để có một đối số từ khóa trong phương thức value_counts đã được triển khai:

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

Câu trả lời tốt nhất cho đến nay, nó cũng cho phép đếm các loại giá trị khác.
gabious

19

nếu nó chỉ đếm các giá trị nan trong cột gấu trúc thì đây là một cách nhanh chóng

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, Cách này không nhanh lắm nếu bạn có một số cột. Trong trường hợp đó, bạn phải sao chép và dán / gõ vào từng tên cột, sau đó thực hiện lại mã.
Amos Long

17

nếu bạn đang sử dụng Jupyter Notebook, thì còn ....

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

hoặc là

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

hoặc, có bất cứ nơi nào NaN trong dữ liệu, nếu có, ở đâu?

 df.isnull().any()

13

Dưới đây sẽ in tất cả các cột Nan theo thứ tự giảm dần.

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

hoặc là

Dưới đây sẽ in 15 cột Nan đầu tiên theo thứ tự giảm dần.

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

Bạn có thể sử dụng chức năng sau, sẽ cung cấp cho bạn đầu ra trong Dataframe

  • Giá trị không
  • Giá trị bị mất
  • % tổng giá trị
  • Tổng giá trị thiếu không
  • % Tổng giá trị không thiếu
  • Loại dữ liệu

Chỉ cần sao chép và dán chức năng sau đây và gọi nó bằng cách chuyển Dataframe gấu trúc của bạn

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)

Đầu ra

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

Nếu bạn muốn giữ cho nó đơn giản thì bạn có thể sử dụng hàm sau để nhận các giá trị bị thiếu trong%

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

Để đếm số không:

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

Để đếm NaN:

df.isnull().sum()

hoặc là

df.isna().sum()

8

Bạn có thể sử dụng phương thức value_counts và in các giá trị của np.nan

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

Đẹp! Đây là hữu ích nhất nếu bạn muốn đếm cả NaN và không NaN. s.value_counts(dropna = False)
icemtel

8

Vui lòng sử dụng dưới đây cho số lượng cột cụ thể

dataframe.columnName.isnull().sum()


3

Đây là mã để đếm Nullcột giá trị khôn ngoan:

df.isna().sum()

3

Có một bài viết Dzone hay từ tháng 7 năm 2017 trong đó chi tiết các cách khác nhau để tóm tắt các giá trị NaN. Kiểm tra nó ở đây .

Bài viết tôi đã trích dẫn cung cấp giá trị bổ sung bằng cách: (1) Hiển thị cách đếm và hiển thị số lượng NaN cho mỗi cột để người ta có thể dễ dàng quyết định có loại bỏ các cột đó hay không và (2) Trình bày cách chọn các hàng đó trong cụ thể có NaN để chúng có thể được loại bỏ hoặc loại bỏ có chọn lọc.

Đây là một ví dụ nhanh để chứng minh tiện ích của phương pháp này - chỉ với một vài cột có lẽ tính hữu dụng của nó không rõ ràng nhưng tôi thấy nó có ích cho các khung dữ liệu lớn hơn.

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

Một tùy chọn đơn giản khác chưa được đề xuất, chỉ cần đếm NaN, sẽ được thêm vào hình để trả về số lượng hàng bằng NaN.

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

2

df.isnull (). sum () sẽ đưa ra tổng giá trị còn thiếu của cột.

Nếu bạn muốn biết tổng các giá trị bị thiếu trong một cột cụ thể thì đoạn mã sau sẽ hoạt động df.column.isnull (). Sum ()


1

dựa trên câu trả lời đã được đưa ra và một số cải tiến đây là cách tiếp cận của tôi

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

Tôi thíchdf.apply(lambda x: x.value_counts(dropna=False)[np.nan]/x.size*100)
K.-Michael Aye

1

Trong trường hợp bạn cần lấy số lượng không phải NA (không phải Không) và NA (Không có) giữa các nhóm khác nhau được rút ra bởi nhóm:

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

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

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

Điều này trả về số lượng không phải NA, NA và tổng số mục nhập cho mỗi nhóm.


0

Đã sử dụng giải pháp được đề xuất bởi @sushmit trong mã của tôi.

Một biến thể có thể giống nhau cũng có thể là

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

Ưu điểm của việc này là nó trả về kết quả cho từng cột trong df từ đó.


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

Cung cấp như đầu ra:

     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

Giả sử bạn muốn lấy số lượng giá trị còn thiếu (NaN) trong một cột (chuỗi) được gọi là giá trong khung dữ liệu được gọi là đánh giá

#import the dataframe
import pandas as pd

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

Để lấy các giá trị còn thiếu, với n_missing_prices là biến, đơn giản làm

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

sum là phương thức chính ở đây, đã cố gắng sử dụng tính trước khi tôi nhận ra sum là phương pháp phù hợp để sử dụng trong ngữ cảnh này



-1

Đối với nhiệm vụ của bạn, bạn có thể sử dụng pandas.DataFrame.dropna ( https://pandas.pydata.org/pandas-docs/urdy/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)

Với tham số thresh bạn có thể khai báo số lượng tối đa cho các giá trị NaN cho tất cả các cột trong DataFrame.

Mã đầu ra:

     a    b
0  1.0  1.0
1  2.0  2.0
2  3.0  NaN
3  4.0  4.0
4  NaN  NaN
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.