1. 程式人生 > >Python資料操作—資料清理

Python資料操作—資料清理

資料丟失在現實生活中是一個問題。 機器學習和資料探勘等領域由於資料缺失導致資料質量差,因此在模型預測的準確性方面面臨嚴峻的問題。 在這些領域,缺失值處理是使模型更加準確和有效的關鍵。

什麼情況下,以及什麼時候資料會丟失?
讓我們考慮一個產品的線上調查。 很多時候,人們不會分享與他們有關的所有資訊。 很少有人分享他們的經驗,但他們沒有多久使用該產品; 很少有人分享他們使用產品的時間,他們的經驗,但不是他們的聯絡資訊。 因此,以某種方式或其他方式,一部分資料總是會丟失,這在實時中非常普遍。

現在來看看如何使用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

以上為對資料集中的缺失值常用的處理方法。