Hướng dẫn how do you deal with null values in python? - làm thế nào để bạn đối phó với các giá trị null trong python?

Sự khác biệt giữa dữ liệu được tìm thấy trong nhiều hướng dẫn và dữ liệu trong thế giới thực là dữ liệu trong thế giới thực hiếm khi sạch sẽ và đồng nhất. Cụ thể, nhiều bộ dữ liệu thú vị sẽ bị thiếu một số dữ liệu. Để làm cho vấn đề trở nên phức tạp hơn, các nguồn dữ liệu khác nhau có thể chỉ ra dữ liệu bị thiếu theo những cách khác nhau.

Trong phần này, chúng tôi sẽ thảo luận về một số cân nhắc chung cho dữ liệu bị thiếu, thảo luận về cách gấu trúc chọn để đại diện cho nó và chứng minh một số công cụ pandas tích hợp để xử lý dữ liệu bị thiếu trong Python. Ở đây và trong suốt cuốn sách, chúng tôi sẽ đề cập đến việc thiếu dữ liệu nói chung là các giá trị NULL, NAN hoặc NA.

Sự đánh đổi trong các quy ước dữ liệu bị thiếu

Có một số sơ đồ đã được phát triển để chỉ ra sự hiện diện của dữ liệu bị thiếu trong bảng hoặc khung dữ liệu. Nói chung, chúng xoay quanh một trong hai chiến lược: sử dụng mặt nạ cho biết trên toàn cầu chỉ ra các giá trị bị thiếu hoặc chọn giá trị sentinel cho biết mục nhập bị thiếu.

Theo cách tiếp cận mặt nạ, mặt nạ có thể là một mảng boolean hoàn toàn riêng biệt hoặc nó có thể liên quan đến việc chiếm đoạt một bit trong biểu diễn dữ liệu để chỉ ra trạng thái null của một giá trị.

Theo cách tiếp cận Sentinel, giá trị Sentinel có thể là một số quy ước dành riêng cho dữ liệu, chẳng hạn như chỉ ra giá trị số nguyên bị thiếu với -9999 hoặc một số mẫu bit hiếm, hoặc nó có thể là một quy ước toàn cầu hơn, chẳng hạn như chỉ ra giá trị điểm nổi bị thiếu với NAN (không phải là một số), một giá trị đặc biệt là một phần của đặc tả điểm nổi của IEEE.

Không có cách tiếp cận nào trong số này là không có sự đánh đổi: Sử dụng một mảng mặt nạ riêng biệt yêu cầu phân bổ một mảng boolean bổ sung, điều này bổ sung chi phí trong cả lưu trữ và tính toán. Một giá trị sentinel làm giảm phạm vi của các giá trị hợp lệ có thể được biểu diễn và có thể yêu cầu logic thêm (thường không được tối ưu hóa) trong số học CPU và GPU. Các giá trị đặc biệt phổ biến như NAN không có sẵn cho tất cả các loại dữ liệu.

Như trong hầu hết các trường hợp không có lựa chọn tối ưu phổ biến tồn tại, các ngôn ngữ và hệ thống khác nhau sử dụng các quy ước khác nhau. Ví dụ: ngôn ngữ R sử dụng các mẫu bit dành riêng trong mỗi loại dữ liệu làm giá trị sentinel cho biết dữ liệu bị thiếu, trong khi hệ thống SCIDB sử dụng một byte phụ được gắn vào mọi ô cho biết trạng thái NA.

Thiếu dữ liệu trong Pandas¶

Cách mà gấu trúc xử lý các giá trị bị thiếu bị hạn chế bởi sự phụ thuộc của nó vào gói Numpy, không có khái niệm tích hợp về các giá trị NA cho các loại dữ liệu không nổi.

Pandas có thể đã theo hướng dẫn của R trong việc chỉ định các mẫu bit cho từng loại dữ liệu riêng lẻ để chỉ ra sự vô hiệu, nhưng phương pháp này hóa ra là khá khó sử dụng. Mặc dù R chứa bốn loại dữ liệu cơ bản, Numpy hỗ trợ nhiều hơn thế này: ví dụ: trong khi R có một loại số nguyên duy nhất, Numpy hỗ trợ mười bốn loại số nguyên cơ bản khi bạn tính đến các độ trước, độ ký hợp đồng và tính của mã hóa. Đặt một mẫu bit cụ thể trong tất cả các loại numpy có sẵn sẽ dẫn đến một lượng chi phí khó sử dụng trong các hoạt động đặc biệt cho các loại khác nhau, thậm chí có thể yêu cầu một ngã ba mới của gói Numpy. Hơn nữa, đối với các loại dữ liệu nhỏ hơn (chẳng hạn như số nguyên 8 bit), việc hy sinh một chút để sử dụng làm mặt nạ sẽ làm giảm đáng kể phạm vi các giá trị mà nó có thể biểu thị.

Numpy có hỗ trợ cho các mảng đeo mặt nạ - nghĩa là các mảng có mảng mặt nạ boolean riêng được gắn để đánh dấu dữ liệu là "tốt" hoặc "xấu". Pandas có thể bắt nguồn từ điều này, nhưng chi phí trong cả lưu trữ, tính toán và bảo trì mã làm cho nó trở thành một lựa chọn không hấp dẫn.

Với những ràng buộc này, Pandas đã chọn sử dụng Sentinels cho dữ liệu bị thiếu và chọn thêm để sử dụng hai giá trị Python Null đã tồn tại: giá trị nổi đặc biệt

array([1, None, 3, 4], dtype=object)
9 và đối tượng Python
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0. Sự lựa chọn này có một số tác dụng phụ, như chúng ta sẽ thấy, nhưng trong thực tế cuối cùng là một sự thỏa hiệp tốt trong hầu hết các trường hợp quan tâm.

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() 0: Dữ liệu thiếu Pythonic

Giá trị Sentinel đầu tiên được sử dụng bởi Pandas là

for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0, một đối tượng Singleton Python thường được sử dụng để thiếu dữ liệu trong mã Python. Bởi vì nó là một đối tượng Python,
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0 không thể được sử dụng trong bất kỳ mảng Numpy/Pandas tùy ý nào, nhưng chỉ trong các mảng có loại dữ liệu
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
4 (tức là, các mảng của các đối tượng Python):

In [1]:

import numpy as np
import pandas as pd

In [2]:

vals1 = np.array([1, None, 3, 4])
vals1

Out[2]:

array([1, None, 3, 4], dtype=object)

Điều này

for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
5 có nghĩa là biểu diễn loại phổ biến tốt nhất có thể suy ra cho nội dung của mảng là chúng là các đối tượng python. Mặc dù loại mảng đối tượng này hữu ích cho một số mục đích, bất kỳ hoạt động nào trên dữ liệu sẽ được thực hiện ở cấp độ Python, với chi phí cao hơn nhiều so với các hoạt động nhanh thông thường được thấy cho các mảng có loại gốc:

In [3]:

for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()

dtype = object
10 loops, best of 3: 78.2 ms per loop

dtype = int
100 loops, best of 3: 3.06 ms per loop

Việc sử dụng các đối tượng Python trong một mảng cũng có nghĩa là nếu bạn thực hiện các tập hợp như

for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
6 hoặc
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
7 trên một mảng có giá trị
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0, bạn thường sẽ gặp lỗi:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 vals1.sum()

/Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

Điều này phản ánh thực tế rằng sự bổ sung giữa số nguyên và

for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0 không được xác định.

array([1, None, 3, 4], dtype=object)9: Thiếu dữ liệu số

Biểu diễn dữ liệu bị thiếu khác,

array([1, None, 3, 4], dtype=object)
9 (từ viết tắt không phải là số), là khác nhau; Nó là một giá trị điểm nổi đặc biệt được công nhận bởi tất cả các hệ thống sử dụng biểu diễn điểm nổi tiêu chuẩn của IEEE:

In [5]:

vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype

Lưu ý rằng Numpy đã chọn một loại dấu phẩy động gốc cho mảng này: điều này có nghĩa là không giống như mảng đối tượng từ trước, mảng này hỗ trợ các hoạt động nhanh được đẩy vào mã được biên dịch. Bạn nên lưu ý rằng

array([1, None, 3, 4], dtype=object)
9 giống như một loại virus dữ liệu, nó lây nhiễm bất kỳ đối tượng nào khác mà nó chạm vào. Bất kể hoạt động nào, kết quả của số học với
array([1, None, 3, 4], dtype=object)
9 sẽ là một
array([1, None, 3, 4], dtype=object)
9 khác:

Lưu ý rằng điều này có nghĩa là tổng hợp các giá trị được xác định rõ (nghĩa là, chúng không dẫn đến lỗi) nhưng không phải lúc nào cũng hữu ích:

In [8]:

vals2.sum(), vals2.min(), vals2.max()

Numpy không cung cấp một số tập hợp đặc biệt sẽ bỏ qua các giá trị bị thiếu này:

In [9]:

np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)

Hãy nhớ rằng

array([1, None, 3, 4], dtype=object)
9 đặc biệt là một giá trị dấu phẩy động; Không có giá trị NAN tương đương cho số nguyên, chuỗi hoặc các loại khác.

Nan và không có ở Pandas¶

array([1, None, 3, 4], dtype=object)
9 và
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0 đều có vị trí của họ và gấu trúc được xây dựng để xử lý hai người họ gần như thay thế cho nhau, chuyển đổi giữa chúng khi thích hợp:

In [10]:

pd.Series([1, np.nan, 2, None])

Out[10]:

vals1 = np.array([1, None, 3, 4])
vals1
0

Đối với các loại không có giá trị sentinel có sẵn, gấu trúc tự động loại đúc khi có giá trị Na. Ví dụ: nếu chúng ta đặt một giá trị trong một mảng số nguyên thành

dtype = object
10 loops, best of 3: 78.2 ms per loop

dtype = int
100 loops, best of 3: 3.06 ms per loop

8, nó sẽ tự động được nâng lên thành một loại dấu phẩy động để chứa NA:

In [11]:

vals1 = np.array([1, None, 3, 4])
vals1
1

Out[12]:

vals1 = np.array([1, None, 3, 4])
vals1
2

Lưu ý rằng ngoài việc đúc mảng số nguyên thành điểm nổi, gấu trúc tự động chuyển đổi

for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0 thành giá trị
array([1, None, 3, 4], dtype=object)
9. .

Mặc dù loại ma thuật này có thể cảm thấy hơi hack so với cách tiếp cận thống nhất hơn đối với các giá trị NA trong các ngôn ngữ dành riêng cho miền như R, phương pháp tiếp cận Sentinel/casting của Pandas hoạt động khá tốt trong thực tế và theo kinh nghiệm của tôi chỉ hiếm khi gây ra vấn đề.

Bảng sau đây liệt kê các quy ước upcasting trong gấu trúc khi các giá trị NA được giới thiệu:

TypeclassChuyển đổi khi lưu trữ NASGiá trị na sentinel
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 vals1.sum()

/Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
1
Không thay đổi
dtype = object
10 loops, best of 3: 78.2 ms per loop

dtype = int
100 loops, best of 3: 3.06 ms per loop

8
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 vals1.sum()

/Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
3
Không thay đổi
dtype = object
10 loops, best of 3: 78.2 ms per loop

dtype = int
100 loops, best of 3: 3.06 ms per loop

8
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 vals1.sum()

/Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
3
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0 hoặc
dtype = object
10 loops, best of 3: 78.2 ms per loop

dtype = int
100 loops, best of 3: 3.06 ms per loop

8
dtype = object
10 loops, best of 3: 78.2 ms per loop

dtype = int
100 loops, best of 3: 3.06 ms per loop

8
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 vals1.sum()

/Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
3
for dtype in ['object', 'int']:
    print("dtype =", dtype)
    %timeit np.arange(1E6, dtype=dtype).sum()
    print()
0 hoặc
dtype = object
10 loops, best of 3: 78.2 ms per loop

dtype = int
100 loops, best of 3: 3.06 ms per loop

8
dtype = object
10 loops, best of 3: 78.2 ms per loop

dtype = int
100 loops, best of 3: 3.06 ms per loop

8

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 vals1.sum()

/Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
3

for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() 0 hoặc dtype = object 10 loops, best of 3: 78.2 ms per loop dtype = int 100 loops, best of 3: 3.06 ms per loop 8

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 vals1.sum()

/Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
     30 
     31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
---> 32     return umr_sum(a, axis, dtype, out, keepdims)
     33 
     34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
6

  • Đúc đến
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
     in ()
    ----> 1 vals1.sum()
    
    /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
         30 
         31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
    ---> 32     return umr_sum(a, axis, dtype, out, keepdims)
         33 
         34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):
    
    TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
    7
  • ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
     in ()
    ----> 1 vals1.sum()
    
    /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
         30 
         31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
    ---> 32     return umr_sum(a, axis, dtype, out, keepdims)
         33 
         34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):
    
    TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
    9
  • Đúc đến
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
     in ()
    ----> 1 vals1.sum()
    
    /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
         30 
         31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
    ---> 32     return umr_sum(a, axis, dtype, out, keepdims)
         33 
         34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):
    
    TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
    3
  • Hãy nhớ rằng trong gấu trúc, dữ liệu chuỗi luôn được lưu trữ với
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
     in ()
    ----> 1 vals1.sum()
    
    /Users/jakevdp/anaconda/lib/python3.5/site-packages/numpy/core/_methods.py in _sum(a, axis, dtype, out, keepdims)
         30 
         31 def _sum(a, axis=None, dtype=None, out=None, keepdims=False):
    ---> 32     return umr_sum(a, axis, dtype, out, keepdims)
         33 
         34 def _prod(a, axis=None, dtype=None, out=None, keepdims=False):
    
    TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
    3 DTYPE.

Hoạt động trên Null Value¶

Như chúng ta đã thấy, Pandas xử lý for dtype in ['object', 'int']: print("dtype =", dtype) %timeit np.arange(1E6, dtype=dtype).sum() print() 0 và array([1, None, 3, 4], dtype=object)9 về cơ bản có thể hoán đổi cho nhau để chỉ ra các giá trị thiếu hoặc null. Để tạo điều kiện cho quy ước này, có một số phương pháp hữu ích để phát hiện, loại bỏ và thay thế các giá trị null trong các cấu trúc dữ liệu gấu trúc. Họ đang:

vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype
6: Tạo mặt nạ Boolean cho biết các giá trị bị thiếu

In [13]:

vals1 = np.array([1, None, 3, 4])
vals1
3

Out[14]:

vals1 = np.array([1, None, 3, 4])
vals1
4

Out[15]:

vals1 = np.array([1, None, 3, 4])
vals1
5

vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype
7: Đối diện với
vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype
6

vals2 = np.array([1, np.nan, 3, 4]) vals2.dtype 9: Trả về phiên bản lọc dữ liệu

vals2.sum(), vals2.min(), vals2.max()
0: Trả về một bản sao của dữ liệu với các giá trị bị thiếu được điền hoặc bị buộc tội

Out[16]:

vals1 = np.array([1, None, 3, 4])
vals1
5

Chúng tôi sẽ kết thúc phần này với một cuộc thăm dò ngắn gọn và trình diễn các thói quen này.

In [17]:

vals1 = np.array([1, None, 3, 4])
vals1
7

Out[17]:

012
01.0 Phát hiện các giá trị null2
12.0 3.0 5
2Phát hiện các giá trị null4.0 6

Cấu trúc dữ liệu PANDAS có hai phương pháp hữu ích để phát hiện dữ liệu null:

vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype
6 và
vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype
7. Một trong hai sẽ trả lại mặt nạ Boolean trên dữ liệu. Ví dụ:

Các phương pháp

vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype
6 và
vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype
7 tạo ra kết quả boolean tương tự cho
vals2.sum(), vals2.min(), vals2.max()
5s.

Bỏ giá trị null

In & nbsp; [19]:

vals1 = np.array([1, None, 3, 4])
vals1
8

Nhưng điều này cũng làm giảm một số dữ liệu tốt; Bạn có thể quan tâm đến việc thả các hàng hoặc cột với tất cả các giá trị NA hoặc phần lớn các giá trị NA. Điều này có thể được chỉ định thông qua các tham số

np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
6 hoặc
np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
7, cho phép kiểm soát tốt số lượng null cho phép thông qua.

Mặc định là

np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
8, sao cho bất kỳ hàng hoặc cột nào (tùy thuộc vào từ khóa
np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
9) chứa giá trị null sẽ bị loại bỏ. Bạn cũng có thể chỉ định
pd.Series([1, np.nan, 2, None])
0, sẽ chỉ thả các hàng/cột là tất cả các giá trị null:

Out[20]:

0123
01.0 Nan2 Nan
12.0 3.0 5 Nan
2Nan4.0 6 Nan

In [21]:

vals1 = np.array([1, None, 3, 4])
vals1
9

Out[21]:

012
01.0 Nan2
12.0 3.0 5
2Nan4.0 6

Đối với điều khiển hạt mịn hơn, tham số

np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
7 cho phép bạn chỉ định số lượng giá trị không null tối thiểu cho hàng/cột được giữ:

In [22]:

array([1, None, 3, 4], dtype=object)
0

Ở đây hàng đầu tiên và hàng cuối cùng đã bị loại bỏ, vì chúng chỉ chứa hai giá trị không null.

Lấp đầy các giá trị null

Đôi khi thay vì bỏ các giá trị NA, bạn muốn thay thế chúng bằng một giá trị hợp lệ. Giá trị này có thể là một số duy nhất như số không, hoặc nó có thể là một loại cắt hoặc nội suy từ các giá trị tốt. Bạn có thể thực hiện tại chỗ bằng cách sử dụng phương thức

vals2 = np.array([1, np.nan, 3, 4]) 
vals2.dtype
6 làm mặt nạ, nhưng vì đây là một hoạt động phổ biến như vậy cung cấp phương thức
vals2.sum(), vals2.min(), vals2.max()
0, trả về một bản sao của mảng với các giá trị null được thay thế.

Hãy xem xét các

vals2.sum(), vals2.min(), vals2.max()
8 sau đây:

In [23]:

array([1, None, 3, 4], dtype=object)
1

Out[23]:

array([1, None, 3, 4], dtype=object)
2

Chúng ta có thể điền vào các mục NA với một giá trị duy nhất, chẳng hạn như Zero:

Out[24]:

array([1, None, 3, 4], dtype=object)
3

Chúng tôi có thể chỉ định một forward filling để truyền giá trị trước đó:

In [25]:

array([1, None, 3, 4], dtype=object)
4

Out[25]:

array([1, None, 3, 4], dtype=object)
5

Hoặc chúng ta có thể chỉ định một phần quay ngược để truyền các giá trị tiếp theo ngược:

In [26]:

array([1, None, 3, 4], dtype=object)
6

Out[26]:

array([1, None, 3, 4], dtype=object)
7

Đối với

vals2.sum(), vals2.min(), vals2.max()
5s, các tùy chọn tương tự nhau, nhưng chúng tôi cũng có thể chỉ định
np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
9 cùng với việc điền vào:

Out[27]:

0123
01.0 Nan2 Nan
12.0 3.0 5 Nan
2Nan4.0 6 Nan

In [28]:

array([1, None, 3, 4], dtype=object)
8

Out[28]:

0123
01.0 1.0 2.0 2.0
12.0 3.0 5.0 5.0
2Nan4.0 6.0 6.0

Đối với điều khiển hạt mịn hơn, tham số

np.nansum(vals2), np.nanmin(vals2), np.nanmax(vals2)
7 cho phép bạn chỉ định số lượng giá trị không null tối thiểu cho hàng/cột được giữ: