1. 程式人生 > >《利用python進行資料分析.第三版》 第七章 資料清洗和準備

《利用python進行資料分析.第三版》 第七章 資料清洗和準備

7.1 處理缺失資料

缺失資料在pandas中呈現的方式有些不完美,但對於大多數使用者可以保證功能正常。對於數值資料,pandas使用浮點值NaN(Not a Number)表示缺失資料。我們稱其為哨兵值,可以方便的檢測出來。
處理缺失資料有以下幾個方法:
這裡寫圖片描述

  1. 判斷是否為缺失資料,布林型別
    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

利用函式或對映進行資料轉換