《利用python進行資料分析.第三版》 第七章 資料清洗和準備
阿新 • • 發佈:2019-01-22
7.1 處理缺失資料
缺失資料在pandas中呈現的方式有些不完美,但對於大多數使用者可以保證功能正常。對於數值資料,pandas使用浮點值NaN(Not a Number)表示缺失資料。我們稱其為哨兵值,可以方便的檢測出來。
處理缺失資料有以下幾個方法:
- 判斷是否為缺失資料,布林型別
pd.isnull
pd.notnull
舉例說明:
import pandas as pd
import numpy as np
data=pd.Series(["liming",'xiaohong',np.nan,"xiaoshu"])
print(data)
data[3 ]=None
print(data)
data1=data.isnull()
print(data1)
answer:
0 liming
1 xiaohong
2 NaN
3 xiaoshu
dtype: object
0 liming
1 xiaohong
2 NaN
3 None
dtype: object
0 False
1 False
2 True
3 True
dtype: bool
濾除缺失資料
pd.dropna([axis=0/1],[how="all"])#括號裡面是選填條件,預設是0
舉例說明:
1、Series一維陣列的濾除缺失資料
data2=data.dropna()
print(data2)
0 liming
1 xiaohong
3 xiaoshu
dtype: object
2、DataFrame二維陣列濾除缺失資料
data3=pd.DataFrame([
[1., 6.5, 3.], [1., np.nan, np.nan],
[np.nan, np.nan,np.nan], [np.nan, 6.5, 3.]
])
print(data3)
#預設axis=0,濾除只要含有缺失值的資料的行
data4=data3.dropna ()
print(data4)
#預設axis=0,濾除行所有的數值都為缺失值的行
data5=data3.dropna(how="all")
print(data5)
answer:
data3
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
data4
0 1 2
0 1.0 6.5 3.0
data5
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0
#新增新的一列,定位axis=1的資料
data3[4]=np.nan
print(data3)
data7=data6.dropna(axis=1)
print(data7)
3、另一個濾除DataFrame行的問題涉及時間序列資料。假設你只想留下一部分觀測資料,可以用thresh引數實現此目的:
data8=pd.DataFrame(np.random.randn(7,3))
data8.iloc[:4,1]=np.nan
data8.iloc[:3,2]=np.nan
print(data8)
print(data8.dropna(thresh=2))#濾除含有兩個的空值
answer:
0 1 2
0 1.720139 NaN NaN
1 1.480859 NaN NaN
2 1.469710 NaN NaN
3 0.065648 NaN 1.950179
4 0.521906 0.423313 0.575727
5 -0.185384 0.543688 0.092195
6 -1.478984 -0.280495 0.739243
濾除含有2個空值的資料
0 1 2
3 0.065648 NaN 1.950179
4 0.521906 0.423313 0.575727
5 -0.185384 0.543688 0.092195
6 -1.478984 -0.280495 0.739243
填充資料
data8=pd.DataFrame(np.random.randn(7,3))
data8.iloc[:4,1]=np.nan
data8.iloc[:2,2]=np.nan
#填充資料0
data9=data8.fillna(0)#fillna預設會返回新物件
#print(data8)
print(data9)
#通過一個字典呼叫fillna,就可以實現對不同的列填充不同的值:
data10=data8.fillna({1:0.5,2:0})
print(data10)
answer:
0 1 2
0 -0.171332 0.000000 0.000000
1 -0.150760 0.000000 0.000000
2 -0.286562 0.000000 0.347290
3 0.464620 0.000000 1.755258
4 1.131274 -0.161065 0.131859
5 -1.649791 0.672376 1.216424
6 1.735930 0.420943 1.562621
0 1 2
0 -0.171332 0.500000 0.000000
1 -0.150760 0.500000 0.000000
2 -0.286562 0.500000 0.347290
3 0.464620 0.500000 1.755258
4 1.131274 -0.161065 0.131859
5 -1.649791 0.672376 1.216424
6 1.735930 0.420943 1.562621
#對填充的物件進行就地修改,因為之前說過填充後會預設形成一個新的物件,所以可以選擇就地填充inplace=True
_ = df.fillna(0, inplace=True)
#向前填充
df.fillna(method='ffill')
#向前填充,並且限制只能向前填充兩個
df.fillna(method='ffill', limit=2)
#填充一組資料的平均數
data.fillna(data.mean())
7.2 資料轉換
本章到目前為止介紹的都是資料的重排。另一類重要操作則是過濾、清理以及其他的轉換工作。
語法規則
data4.drop_duplicates(self,subset=None,keep=”fist”,inplace=False)
self:列表定義根據哪一列或者幾列去重
keep:duplicated和drop_duplicates預設保留的是第一個出現的值組合。傳入keep=’last’則保留最後一個:
inplace:預設是生成新的一個數組,如果就地修改就True
import pandas as pd
data1=pd.DataFrame({"k1":["one",'two']*3+["two"],"k2":[1,1,2,3,3,4,4]})
# print(data1)
data2=data1.duplicated()
print(data1)
print(data2)
data3=data1.drop_duplicates()
print(data3)
data1["k3"]=range(7)
data4=data1.drop_duplicates(["k1"])
print(data4)
data5=data1.drop_duplicates(["k1","k2"],keep="last")
print(data5)
answer:
data1
k1 k2
0 one 1
1 two 1
2 one 2
3 two 3
4 one 3
5 two 4
6 two 4
data2
0 False
1 False
2 False
3 False
4 False
5 False
6 True
dtype: bool
data3
k1 k2
0 one 1
1 two 1
2 one 2
3 two 3
4 one 3
5 two 4
data4
k1 k2 k3
0 one 1 0
1 two 1 1
data5
k1 k2 k3
0 one 1 0
1 two 1 1
2 one 2 2
3 two 3 3
4 one 3 4
6 two 4 6
利用函式或對映進行資料轉換