DataFrame——数据清洗

阿雷边学边教python数据分析第3期——pandas与numpy


 

  1. #导入pandas库和numpy库
  2. importas pd
  3. importas np

 

1.缺失值处理

python中用NaN(Not a Number)表示缺失数据

 

  1. #示例数据
  2. df =.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 =.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 =.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 =.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 =.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 =.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 =.head(10)

 

  1. #忽略警告
  2. import warnings
  3. warnings.filterwarnings("ignore")

(1)单一对象替换单个值 
df["colname"].replace("替换对象","替换值")

 

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

(2)多对象替换单个值 
df["colname"].replace(["替换对象1","替换对象2",...],"替换值")

 

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

(3)用不同的值替换不同的对象 
df["colname"].replace(["替换对象1","替换对象2",...],["替换值1","替换值2",...])

 

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

(4)参数也可以是字典 
df["colname"].replace({"替换对象1":替换值1,"替换对象2":替换值2,...})

 

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