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() và 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