Python - Làm sạch dữ liệu

Thiếu dữ liệu luôn là một vấn đề trong các tình huống thực tế. Các lĩnh vực như máy học và khai thác dữ liệu phải đối mặt với các vấn đề nghiêm trọng về độ chính xác của các dự đoán mô hình của họ do chất lượng dữ liệu kém do các giá trị bị thiếu. Trong những lĩnh vực này, việc xử lý giá trị còn thiếu là một trọng tâm chính để làm cho các mô hình của họ chính xác và hợp lệ hơn.

Khi nào và Tại sao Dữ liệu bị Thiếu?

Hãy để chúng tôi xem xét một cuộc khảo sát trực tuyến cho một sản phẩm. Nhiều khi, mọi người không chia sẻ tất cả các thông tin liên quan đến họ. Ít người chia sẻ kinh nghiệm của họ, nhưng không phải là họ sử dụng sản phẩm trong bao lâu; ít người chia sẻ họ đã sử dụng sản phẩm trong bao lâu, trải nghiệm của họ nhưng không chia sẻ thông tin liên hệ của họ. Do đó, theo một cách nào đó hay cách khác, một phần dữ liệu luôn bị thiếu và điều này rất phổ biến trong thời gian thực.

Bây giờ chúng ta hãy xem cách chúng ta có thể xử lý các giá trị bị thiếu (giả sử NA hoặc NaN) bằng cách sử dụng Pandas.

# import the pandas library
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df

Nó là output như sau -

one        two      three
a   0.077988   0.476149   0.965836
b        NaN        NaN        NaN
c  -0.390208  -0.551605  -2.301950
d        NaN        NaN        NaN
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g        NaN        NaN        NaN
h   0.085100   0.532791   0.887415

Sử dụng lập chỉ mục lại, chúng tôi đã tạo DataFrame bị thiếu các giá trị. Trong đầu ra,NaN có nghĩa Not a Number.

Kiểm tra các giá trị bị thiếu

Để giúp phát hiện các giá trị bị thiếu dễ dàng hơn (và trên các kiểu mảng khác nhau), Pandas cung cấp isnull()notnull() các hàm, cũng là các phương thức trên các đối tượng Series và DataFrame -

Thí dụ

import pandas as pd
import numpy as np
 
df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df['one'].isnull()

Nó là output như sau -

a  False
b  True
c  False
d  True
e  False
f  False
g  True
h  False
Name: one, dtype: bool

Làm sạch / lấp đầy dữ liệu bị thiếu

Pandas cung cấp nhiều phương pháp khác nhau để làm sạch các giá trị bị thiếu. Hàm fillna có thể “điền vào” các giá trị NA với dữ liệu không phải null theo một số cách, mà chúng tôi đã minh họa trong các phần sau.

Thay thế NaN bằng Giá trị vô hướng

Chương trình sau đây cho biết cách bạn có thể thay thế "NaN" bằng "0".

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])
df = df.reindex(['a', 'b', 'c'])
print df
print ("NaN replaced with '0':")
print df.fillna(0)

Nó là output như sau -

one        two     three
a  -0.576991  -0.741695  0.553172
b        NaN        NaN       NaN
c   0.744328  -1.735166  1.749580

NaN replaced with '0':
         one        two     three
a  -0.576991  -0.741695  0.553172
b   0.000000   0.000000  0.000000
c   0.744328  -1.735166  1.749580

Ở đây, chúng ta đang điền giá trị bằng 0; thay vào đó chúng ta cũng có thể điền vào bất kỳ giá trị nào khác.

Điền NA Forward và Backward

Sử dụng các khái niệm điền được thảo luận trong Chương ReIndexing, chúng tôi sẽ điền các giá trị còn thiếu.

phương pháp Hoạt động
pad / điền Điền các phương thức Chuyển tiếp
bfill / lấp đầy Điền các phương thức Backward

Thí dụ

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print df.fillna(method='pad')

Nó là output như sau -

one        two      three
a   0.077988   0.476149   0.965836
b   0.077988   0.476149   0.965836
c  -0.390208  -0.551605  -2.301950
d  -0.390208  -0.551605  -2.301950
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g  -0.930230  -0.670473   1.146615
h   0.085100   0.532791   0.887415

Bỏ các giá trị bị thiếu

Nếu bạn chỉ muốn loại trừ các giá trị bị thiếu, thì hãy sử dụng dropna chức năng cùng với axistranh luận. Theo mặc định, axis = 0, tức là dọc theo hàng, có nghĩa là nếu bất kỳ giá trị nào trong một hàng là NA thì toàn bộ hàng sẽ bị loại trừ.

Thí dụ

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print df.dropna()

Nó là output như sau -

one        two      three
a   0.077988   0.476149   0.965836
c  -0.390208  -0.551605  -2.301950
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
h   0.085100   0.532791   0.887415

Thay thế các giá trị chung bị thiếu (hoặc)

Nhiều lần, chúng ta phải thay thế một giá trị chung bằng một giá trị cụ thể nào đó. Chúng ta có thể đạt được điều này bằng cách áp dụng phương pháp thay thế.

Thay thế NA bằng một giá trị vô hướng là hành vi tương đương của fillna() chức năng.

Thí dụ

import pandas as pd
import numpy as np
df = pd.DataFrame({'one':[10,20,30,40,50,2000],
'two':[1000,0,30,40,50,60]})
print df.replace({1000:10,2000:60})

Nó là output như sau -

one  two
0   10   10
1   20    0
2   30   30
3   40   40
4   50   50
5   60   60