原文地址:https://www.zybuluo.com/jk88876594/note/802632
DataFrame——數據清洗
阿雷邊學邊教python數據分析第3期——pandas與numpy
#導入pandas庫和numpy庫
import pandas as pd
import numpy as np
1.缺失值處理
python中用NaN(Not a Number)表示缺失數據
#示例數據
df = pd.read_csv("pokemon_data.csv",encoding="gbk")
#查看數據前十行
df.head(10)
(1)判斷缺失值
df.isnull() #判斷數據表所有數據的缺失值
df["類型2"].isnull() #判斷數據表某一列的缺失值
#查看類型2這一列的非缺失值和缺失值的數量分布
df["類型2"].isnull().value_counts()
(2)刪除缺失值
df.dropna() #刪除掉含有缺失值的所有行
df.dropna(how="any") #刪除掉含有缺失值的所有行
df.dropna()等價於df.dropna(how="any")
df.dropna(how="all") #刪除滿足行內數據均為NaN這個條件的行
#創建一個4行3列的含有NaN的數據作為演示
df1 = pd.DataFrame([[1,5,np.nan],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
df1
#how="all"能刪除掉均為NaN的行
df1.dropna(how="all")
#刪除滿足列內數據均為NaN這個條件的列,按列刪除
df1.dropna(how="all",axis=1)
(3)填充缺失值
# 示例數據
df1 = pd.DataFrame([[1,5,np.nan],[2,np.nan,np.nan],[2,3,np.nan],[np.nan,np.nan,np.nan]])
- 填充指定值
df1.fillna(value=0)
- 填充函數
#對第2列的缺失值,用該列的均值填充
df1[1].fillna(df1[1].mean())
- 向前填充
#對第2列的缺失值進行向前填充
df1[1].fillna(method="ffill")
- 向后填充
#對第2列的缺失值進行向后填充
df1[1].fillna(method="bfill")
2.清除空格
#創建含有空格的數據
dict1 = {"name":["小紅","小明","小張"],"age":[16,17,18],"city":["北京 ","杭州"," 上海 "]}
df2 = pd.DataFrame(dict1,columns=["name","age","city"])
#清除空格
df2["city"]=df2["city"].map(str.strip)
3.轉換數據格式
df2["age"]=df2["age"].astype("str") #轉換成字符串格式
df2["age"]=df2["age"].astype("float") #轉換成浮點數格式
df2["age"]=df2["age"].astype("int") #轉換成整數格式
4.大小寫轉換
df2["city"]=df2["city"].str.lower() #轉換成全小寫
df2["city"]=df2["city"].str.upper() #轉換成全大寫
df2["city"]=df2["city"].str.title() #轉換成首字母大寫
5.更改列名
#通過rename函數修改部分列名或者所有列名,並默認返回一個新的數據框,若需要在原基礎上修改,添加參數inplace=True即可
df2.rename(columns={"name":"name2","age":"age2"})
#通過columns屬性修改列名,這種方式就需要輸入所有的列名了,並直接在原基礎上修改
df2.columns = ["n","a","c"]
6.更改索引與重置索引
(1)更改索引
set_index()
df.set_index("類型1")
(2)重置索引
reset_index()
df.reset_index()
7.重復值處理
#示例數據
df5 = pd.DataFrame({"c1":["apple"]*3 + ["banana"]*3,"c2":[1,1,2,3,3,2]})
(1)查看是否有重復值
#適合小數據目測
df5.duplicated(subset=["c1","c2"],keep="first")
#當數據量比較大的時候,可以看看重復數據和非重復數據的計數分布
df5_duplicated = df5.duplicated(subset=["c1","c2"],keep="first")
df5_duplicated.value_counts()
(2)保留重復值
df5[df5.duplicated(subset=["c1","c2"],keep="first")]
(3)刪除重復值
#默認保留第一個出現的重復值,刪除掉后面的重復值
df5.drop_duplicates(subset=["c1","c2"],keep="first")
#保留最后一個重復值,刪除掉前面的重復值
df5.drop_duplicates(subset=["c1","c2"],keep="last")
#如果希望直接在原基礎上修改,添加參數inplace=True
df5.drop_duplicates(subset=["c1","c2"],keep="last",inplace=True)
8.替換值
#示例數據
df6 = df.head(10)
#忽略警告
import warnings
warnings.filterwarnings("ignore")
(1)單一對象替換單個值
df["colname"].replace("替換對象","替換值")
df6["類型1"] = df6["類型1"].replace("Grass","G")
(2)多對象替換單個值
df["colname"].replace(["替換對象1","替換對象2",...],"替換值")
df6["類型1"] = df6["類型1"].replace(["G","Fire"],"gf")
(3)用不同的值替換不同的對象
df["colname"].replace(["替換對象1","替換對象2",...],["替換值1","替換值2",...])
df6["類型1"] = df6["類型1"].replace(["gf","Water"],["good","W"])
(4)參數也可以是字典
df["colname"].replace({"替換對象1":替換值1,"替換對象2":替換值2,...})
df6["類型1"] = df6["類型1"].replace({"good":"gg","W":"ww"})