Python数据分析-基于pandas的数据清洗
一、处理丢失数据
(1)丢失数据的类型
1)None
2) np.nan(NaN)
两种丢失数据的区别:
type(None)
NoneType
type(np.nan)
float
为什么在数据分析中需要用到的是浮点类型的空而不是对象类型?
- 数据分析中会常常使用某些形式的运算来处理原始数据,如果原数数据中的空值为NAN的形式,则不会干扰或者中断运算。
- NAN可以参与运算的
- None是不可以参与运算
np.nan + 1 nan None + 1 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-5-3fd8740bf8ab> in <module> ----> 1 None + 1 TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
在pandas中如果遇到了None形式的空值则pandas会将其强转成NAN的形式。
df = DataFrame(data=np.random.randint(0,100,size=(7,5))) df.iloc[2,3] = None df.iloc[4,2] = np.nan df.iloc[5,4] = None df
二、pandas处理空值操作
- isnull
- notnull
- any
- all
- dropna
- fillna
- 方式1:对空值进行过滤(删除空所在的行数据)
- 技术:isnull,notnull,any,all
df.isnull()
#哪些行中有空值 #any(axis=1)检测哪些行中存有空值 df.isnull().any(axis=1) #any会作用isnull返回结果的每一行 #true对应的行就是存有缺失数据的行
df.notnull()
df.notnull().all(axis=1)
#将布尔值作为源数据的行索引
df.loc[df.notnull().all(axis=1)] #取出不含空的行#获取空对应的行数据
df.loc[df.isnull().any(axis=1)]#获取空对应行数据的行索引
indexs = df.loc[df.isnull().any(axis=1)].index
indexs#获取非空对应行数据的行索引
indexs1 = df.loc[df.notnull().all(axis=1)].index
indexs1df.drop(lables=indexs,axis=0) #drop 删除指定indexs对应的索引的行,axis 0表示为行
方式2:
- dropna:可以直接将缺失的行或者列进行删除
df.dropna(axis=0) #可以直接将缺失的行或者列进行删除
- dropna:可以直接将缺失的行或者列进行删除
- 技术:isnull,notnull,any,all
对缺失值进行覆盖
- fillna
df.fillna(value=999) #使用指定值将源数据中所有的空值进行填充
# 使用上面的自定义任意值 填充 可能会对我们后面的分析有偏导,这里如果不能填充有意义的值建议使用下面的 #使用空的近邻值进行填充 相对来说有意义 #method=ffill向前填充,bfill向后填充 ffill----> f forward 向前 bfill -----> b backward 向后 df.fillna(axis=0,method='bfill')
-
-
什么时候用dropna什么时候用fillna
- 尽量使用dropna,如果删除成本比较高,则使用fillna
- 使用空值对应列的均值进行空值填充
df
for col in df.columns: #检测哪些列中存有空值 if df[col].isnull().sum() > 0:#说明df[col]中存有空值 isnull如果没有空值 全是False 那么再.sum就是0 False 0 True 1 mean_value = df[col].mean() df[col] = df[col].fillna(value=mean_value)
面试题(目前只能做数据清洗部分)
-
数据说明:
- 数据是1个冷库的温度数据,1-7对应7个温度采集设备,1分钟采集一次。
-
数据处理目标:
- 用1-4对应的4个必须设备,通过建立冷库的温度场关系模型,预估出5-7对应的数据。
- 最后每个冷库中仅需放置4个设备,取代放置7个设备。
- f(1-4) --> y(5-7)
-
数据处理过程:
- 1、原始数据中有丢帧现象,需要做预处理;
- 2、matplotlib 绘图;
- 3、建立逻辑回归模型。
-
无标准答案,按个人理解操作即可,请把自己的操作过程以文字形式简单描述一下,谢谢配合。
-
测试数据为testData.xlsx
-
data = pd.read_excel('./data/testData.xlsx').drop(labels=['none','none1'],axis=1) #删除none 和 none1两列 无用数据 data
data.shape #删除空行前数据形状 (1060, 8) #删除空对应的行数据 data.dropna(axis=0).shape #删除后数据形状 空行并不多可以直接删除 (927, 8) #填充 data.fillna(method='ffill',axis=0).fillna(method='bfill',axis=0) #用列向上填充 因为是一个机器的数据 偏差应该不会太大 因为有可能第一行或者最后一行有空值 填充不到 向前填充一次再向后填充一次百分之一万没有空值了
-
三、处理重复数据
df = DataFrame(data=np.random.randint(0,100,size=(8,6))) df.iloc[1] = [1,1,1,1,1,1] df.iloc[3] = [1,1,1,1,1,1] df.iloc[5] = [1,1,1,1,1,1]

#检测哪些行存有重复的数据
df1.duplicated(keep='first') # 保留第一行值 以第一行为参照模板
#一步到位删除
df.drop_duplicates(keep='first')
四、处理异常数据
- 自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,然后将C列中的值大于其两倍标准差的异常值进行清洗
df2 = pd.DataFrame(data=np.random.randint(size=(1000,3)),columns=['A','B','C'])
df2

#制定判定异常值的条件
twice_std = df2['C'].std() * 2
twice_std

df2.loc[~(df2['C'] > twice_std)]