一、处理空值
1.有两种空值:
-
- None--对象类型
- np.nan(NaN)--浮点类型
- 两种空值的区别 :是否可以参与运算
import numpy as np
import pandas as pd
from pandas import DataFrame
为什么数据分析中需要用到的是浮点类型而不是对象类型?
- 数据分析中常常会使用某些形式的运算处理原始数据,如果原始数据中空值为NAN,可以参与运算,但是none不能参与运算。所以在pandas中如果遇到了none形式的空值,pandas会将其强行转化为NAN的形式。
2.pandas如何处理空值?
- isnull()+any()有空值就返回true
- notnull()+all()检测表中是否存在空值
- dropna
- fillna
- 处理方式:
- 1.删除空所对应的行数据
- 2.对空值进行赋值
#不管赋值的时候是none还是np.nan,都会转化为np.nan类型输出
df=DataFrame(data=np.random.randint(0,100,size=(8,7)))
df.iloc[2,3]=None
df.iloc[5,2]=np.nan
df.iloc[6,4]=None
df
(1).对数据进行删除,3种方式
#方式一:df.loc[df.notnull().all(axis=1)]
#使用notnull()判断空值
df.notnull()
#找到空值所对应的行,使用all()
df.notnull().all(axis=1)#axis=0表示列,=1表示行
#将all()函数的结果作为索引取出符合要求的行
df.loc[df.notnull().all(axis=1)]
#方式二:df.loc[~df.isnull().any(axis=1)]
df.isnull()
df.isnull().any(axis=1)
~df.isnull().any(axis=1)#该步骤的目的也是准备用true值作为索引,所以~df.isnull().any()和df.notnull().all(axis=1)等价
df.loc[~df.isnull().any(axis=1)]
#方法三:dropna(axis=0),直接删除数据表中存在空值的行
df.dropna(axis=0)
(2).对数据进行填充fillna()
- 使用空值的近邻值对数据进行填充fillna(method='ffill',axis=0)
df.fillna(method='ffill',axis=0)#axis=0表示在列,ffill表示用前一个数填充,整体表示在列上用前一个数填充。
#method还可以使用'bfill'
思考:什么时候删除空值行,什么时候填充行?
- 如果删除成本不高,那就填充行
二、处理重复值(行数据重复)
df=DataFrame(data=np.random.randint(0,100,size=(8,6)))
df
df.iloc[2]=[2,3,4,4,4,3]
df.iloc[5]=[2,3,4,4,4,3]
df.iloc[7]=[2,3,4,4,4,3]
df
df.drop_duplicates(keep='first')#keep值可以是first,也可以是last
三、处理异常值
- 自定义一个1000行3列(A,B,C)取值范围是0-1的数据源,然后将C列中大于两倍标准差的异常值作为异常值
df=DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
df.head()
#定义异常值的标准:C列中大于两倍标准差的异常值
twice_std=2 * df['C'].std()
twice_std
#判断C列的值是否是异常值,然后取反,利用索引去除异常值
df.loc[~(df['C'] > twice_std)]
df.head(5)