Python資料操作—資料清理
阿新 • • 發佈:2019-01-01
資料丟失在現實生活中是一個問題。 機器學習和資料探勘等領域由於資料缺失導致資料質量差,因此在模型預測的準確性方面面臨嚴峻的問題。 在這些領域,缺失值處理是使模型更加準確和有效的關鍵。
什麼情況下,以及什麼時候資料會丟失?
讓我們考慮一個產品的線上調查。 很多時候,人們不會分享與他們有關的所有資訊。 很少有人分享他們的經驗,但他們沒有多久使用該產品; 很少有人分享他們使用產品的時間,他們的經驗,但不是他們的聯絡資訊。 因此,以某種方式或其他方式,一部分資料總是會丟失,這在實時中非常普遍。
現在來看看如何使用Pandas庫處理缺失值(如NA或NaN)。
# 使用pandas庫處理資料中的缺失值
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(5,3),
index =['a','c','e','f','h'],columns=['one','two','three'])
df = df.reindex (['a','b','c','d','e','f','g','h'])
#使用reindex,建立了一個缺失值的DataFrame
print(df)
輸出結果:
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
一、檢查缺失值,pandas提供了isnull()和notnull()函式
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()) #檢查第一列中是否為null,是返回false,否返回true
輸出結果:
a False
b True
c False
d True
e False
f False
g True
h False
Name: one, dtype: bool
二、清理/填充缺少資料,fillna函式可以通過幾種方式用非空資料“填充”NA值
1、用標量值將”NaN”替換為0
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3,3),index=['a','c','d'],
columns=['one','two','three'])
df = df.reindex(['a','b','c'])
print(df)
print("NaN replace with '0':")
print(df.fillna(0)) #這裡我們用0填充,當然也可以用其他值填充
輸出結果:
one two three
a 0.538547 -0.116047 -0.413233
b NaN NaN NaN
c 0.323509 -0.709677 1.243817
NaN replace with '0':
one two three
a 0.538547 -0.116047 -0.413233
b 0.000000 0.000000 0.000000
c 0.323509 -0.709677 1.243817
2、正向和反向填充NAN
# pad/fill:向前填充方法
# bfill/backfill:向後填充方法
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('向前填充結果:\n',df.fillna(method='pad')) #該行根據前一行的值填充
print('向後填充結果:\n',df.fillna(method='bfill'))#該行根據後一行的值填充
輸出結果:
向前填充結果:
one two three
a -0.989952 1.692963 -1.115485
b -0.989952 1.692963 -1.115485
c -0.218375 -0.090271 -0.381034
d -0.218375 -0.090271 -0.381034
e 0.748527 1.635351 -1.993645
f -0.525781 1.185460 -0.728045
g -0.525781 1.185460 -0.728045
h -0.706908 -0.832507 1.465190
向後填充結果:
one two three
a -0.989952 1.692963 -1.115485
b -0.218375 -0.090271 -0.381034
c -0.218375 -0.090271 -0.381034
d 0.748527 1.635351 -1.993645
e 0.748527 1.635351 -1.993645
f -0.525781 1.185460 -0.728045
g -0.706908 -0.832507 1.465190
h -0.706908 -0.832507 1.465190
3、刪除缺失值:如果只想排除缺少的值,則使用dropna()函式和axis引數。
預設情況下,axis = 0,即沿著一行行查詢,這意味著如果行內的任何值是NA,那麼排除整行。
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'])
print(df)
df = df.reindex(['a','b','c','d','e','f','g','h'])
print(df.dropna())
輸出結果:
one two three
a -1.346925 -1.281311 -0.880618
c 0.494288 -0.822928 0.349231
e 0.519051 -0.459518 0.161189
f 0.143254 1.976580 -0.462714
h -1.615947 0.838520 -0.020003
one two three
a -1.346925 -1.281311 -0.880618
c 0.494288 -0.822928 0.349231
e 0.519051 -0.459518 0.161189
f 0.143254 1.976580 -0.462714
h -1.615947 0.838520 -0.020003
4、替換丟失或通用值,用標量值替換NA與fillna()函式的效果相同。
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('替換之前的結果:\n',df)
print ('替換之後的結果:\n',df.replace({1000:10,2000:60}))
輸出結果:
替換之前的結果:
one two
0 10 1000
1 20 0
2 30 30
3 40 40
4 50 50
5 2000 60
替換之後的結果:
one two
0 10 10
1 20 0
2 30 30
3 40 40
4 50 50
5 60 60
以上為對資料集中的缺失值常用的處理方法。