1. 程式人生 > >文摘:DataFrame資料清洗

文摘:DataFrame資料清洗

原文地址:https://www.zybuluo.com/jk88876594/note/802632

 

DataFrame——資料清洗

阿雷邊學邊教python資料分析第3期——pandas與numpy


 
  1. #匯入pandas庫和numpy庫
  2. import pandas as pd
  3. import numpy as np
 

1.缺失值處理

python中用NaN(Not a Number)表示缺失資料

 
  1. #示例資料
  2. df = pd.read_csv("pokemon_data.csv",encoding="gbk")
  3. #檢視資料前十行
  4. df.head(10)

(1)判斷缺失值

 
  1. df.isnull() #判斷資料表所有資料的缺失值
 
  1. df["型別2"].isnull() #判斷資料表某一列的缺失值
 
  1. #檢視型別2這一列的非缺失值和缺失值的數量分佈
  2. df["型別2"].isnull().value_counts()

(2)刪除缺失值

 
  1. df.dropna() #刪除掉含有缺失值的所有行
 
  1. df.dropna(how="any") #刪除掉含有缺失值的所有行

df.dropna()等價於df.dropna(how="any")

 
  1. df.dropna(how="all") #刪除滿足行內資料均為NaN這個條件的行
 
  1. #建立一個4行3列的含有NaN的資料作為演示
  2. df1 = pd.DataFrame([[1,5,np.nan],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
  3. df1
 
  1. #how="all"能刪除掉均為NaN的行
  2. df1.dropna(how="all")
 
  1. #刪除滿足列內資料均為NaN這個條件的列,按列刪除
  2. df1.dropna(how="all",axis=1)

(3)填充缺失值

 
  1. # 示例資料
  2. df1 = pd.DataFrame([[1,5,np.nan],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
  • 填充指定值
 
  1. df1.fillna(value=0)
  • 填充函式
 
  1. #對第2列的缺失值,用該列的均值填充
  2. df1[1].fillna(df1[1].mean())
  • 向前填充
 
  1. #對第2列的缺失值進行向前填充
  2. df1[1].fillna(method="ffill")
  • 向後填充
 
  1. #對第2列的缺失值進行向後填充
  2. df1[1].fillna(method="bfill")
 

2.清除空格

 
  1. #建立含有空格的資料
  2. dict1 = {"name":["小紅","小明","小張"],"age":[16,17,18],"city":["北京 ","杭州"," 上海 "]}
  3. df2 = pd.DataFrame(dict1,columns=["name","age","city"])
 
  1. #清除空格
  2. df2["city"]=df2["city"].map(str.strip)
 

3.轉換資料格式

 
  1. df2["age"]=df2["age"].astype("str") #轉換成字串格式
  2. df2["age"]=df2["age"].astype("float") #轉換成浮點數格式
  3. df2["age"]=df2["age"].astype("int") #轉換成整數格式
 

4.大小寫轉換

 
  1. df2["city"]=df2["city"].str.lower() #轉換成全小寫
  2. df2["city"]=df2["city"].str.upper() #轉換成全大寫
  3. df2["city"]=df2["city"].str.title() #轉換成首字母大寫
 

5.更改列名

 
  1. #通過rename函式修改部分列名或者所有列名,並預設返回一個新的資料框,若需要在原基礎上修改,新增引數inplace=True即可
  2. df2.rename(columns={"name":"name2","age":"age2"})
 
  1. #通過columns屬性修改列名,這種方式就需要輸入所有的列名了,並直接在原基礎上修改
  2. df2.columns = ["n","a","c"]
 

6.更改索引與重置索引

(1)更改索引 
set_index()

 
  1. df.set_index("型別1")

(2)重置索引 
reset_index()

 
  1. df.reset_index()
 

7.重複值處理

 
  1. #示例資料
  2. df5 = pd.DataFrame({"c1":["apple"]*3 + ["banana"]*3,"c2":[1,1,2,3,3,2]})

(1)檢視是否有重複值

 
  1. #適合小資料目測
  2. df5.duplicated(subset=["c1","c2"],keep="first")
 
  1. #當資料量比較大的時候,可以看看重複資料和非重複資料的計數分佈
  2. df5_duplicated = df5.duplicated(subset=["c1","c2"],keep="first")
  3. df5_duplicated.value_counts()

(2)保留重複值

 
  1. df5[df5.duplicated(subset=["c1","c2"],keep="first")]

(3)刪除重複值

 
  1. #預設保留第一個出現的重複值,刪除掉後面的重複值
  2. df5.drop_duplicates(subset=["c1","c2"],keep="first")
 
  1. #保留最後一個重複值,刪除掉前面的重複值
  2. df5.drop_duplicates(subset=["c1","c2"],keep="last")
 
  1. #如果希望直接在原基礎上修改,新增引數inplace=True
  2. df5.drop_duplicates(subset=["c1","c2"],keep="last",inplace=True)
 

8.替換值

 
  1. #示例資料
  2. df6 = df.head(10)
 
  1. #忽略警告
  2. import warnings
  3. warnings.filterwarnings("ignore")

(1)單一物件替換單個值 
df["colname"].replace("替換物件","替換值")

 
  1. df6["型別1"] = df6["型別1"].replace("Grass","G")

(2)多物件替換單個值 
df["colname"].replace(["替換物件1","替換物件2",...],"替換值")

 
  1. df6["型別1"] = df6["型別1"].replace(["G","Fire"],"gf")

(3)用不同的值替換不同的物件 
df["colname"].replace(["替換物件1","替換物件2",...],["替換值1","替換值2",...])

 
  1. df6["型別1"] = df6["型別1"].replace(["gf","Water"],["good","W"])

(4)引數也可以是字典 
df["colname"].replace({"替換物件1":替換值1,"替換物件2":替換值2,...})

 
    1. df6["型別1"] = df6["型別1"].replace({"good":"gg","W":"ww"})