Bài 22: Missing Data ( Thiếu dữ liệu ) – Python Panda

Trang chủ » Training » Bài 22: Missing Data ( Thiếu dữ liệu ) – Python Panda
22/02/2022 Training 83 viewed
Thiếu dữ liệu luôn là 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à trọng tâm chính để làm cho mô hình của họ chính xác và mang tính hợp lý hơn.

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

Tiến hành xem xét cuộc khảo sát trực tuyến của 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 , 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ệ . 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 (chẳng hạn như 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
Đầu ra :
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 reindexing, đã tạo một DataFrame các giá trị bị thiếu. Trong đầu ra, NaN có nghĩa là Không phải số.
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 các hàm isnull () và notnull (), cũng là các phương thức thuộc Series và DataFrame
Ví dụ 1:
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()
Kết quả :
a  False
b  True
c  False
d  True
e  False
f  False
g  True
h  False
Name: one, dtype: bool
Ví dụ 2 :
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'].notnull()
Kết quả :
a  True
b  False
c  True
d  False
e  True
f  True
g  False
h  True
Name: one, dtype: bool
Các phép tính thiếu dữ liệu
  • Khi tổng hợp dữ liệu, NA sẽ được coi là Zero
  • Nếu dữ liệu đều là NA thì kết quả sẽ là NA
Ví dụ 3 :
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'].sum()
Kết quả :
2.02357685917
Ví dụ 4 :
import pandas as pd
import numpy as np

df = pd.DataFrame(index=[0,1,2,3,4,5],columns=['one','two'])
print df['one'].sum()
Kết quả :
nan

2. 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, ta sẽ minh họa trong các phần sau.
a. Thay thế NaN bằng Giá trị vô hướng
Thay “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)
Kết quả :
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.
b. Điền NA Forward và Backward
Sử dụng các khái niệm fill được thảo luận trong Bài ReIndexing, ta sẽ điền các giá trị còn thiếu.
  • pad/fill : Fill methods Forward
  • bfill/backfill : Fill methods Backward
Ví dụ 1 :
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')
Kết quả :
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
Ví dụ 2 :
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='backfill')
Kết quả :
one        two      three
a   0.077988   0.476149   0.965836
b  -0.390208  -0.551605  -2.301950
c  -0.390208  -0.551605  -2.301950
d  -2.000303  -0.788201   1.510072
e  -2.000303  -0.788201   1.510072
f  -0.930230  -0.670473   1.146615
g   0.085100   0.532791   0.887415
h   0.085100   0.532791   0.887415

3. Bỏ các giá trị bị thiếu ( Drop ) :

Nếu bạn chỉ muốn loại bỏ các giá trị bị thiếu,  sử dụng hàm dropna cùng với đối số trục. 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ừ.
Ví dụ 1 :
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()
Kết quả :
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
Ví dụ 2 :
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(axis=1)
Kết quả :
Empty DataFrame
Columns: [ ]
Index: [a, b, c, d, e, f, g, h]

4. Thay thế các giá trị chung Hoặc giá trị bị thiếu

Nhiều lần, ta phải thay thế một giá trị chung bằng một giá trị cụ thể nào đó. Sử dụng phương pháp thay thế.
Thay thế NA bằng một giá trị vô hướng bằng hàm fillna ().
Ví dụ 1 :
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})
Kết quả :
one  two
0   10   10
1   20    0
2   30   30
3   40   40
4   50   50
5   60   60
Ví dụ 2 :
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})
Kết quả :
one  two
0   10   10
1   20    0
2   30   30
3   40   40
4   50   50
5   60   60
Chia sẻ:
Tags:
TOP HOME