首页 > 其他 > 详细

基于pandas的数据清洗

时间:2020-07-14 20:59:53      阅读:113      评论:0      收藏:0      [点我收藏+]

处理丢失数据

  • 有两种丢失数据:
    • None
    • 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)]

技术分享图片

 

 df.loc[-df.isnull().any(axis=1)] #前面取反 也可以取出非空行

技术分享图片


#获取空对应行数据的行索引
indexs = df.loc[df.isnull().any(axis=1)].index
indexs

技术分享图片

 


 df.drop(labels=indexs,axis=0)  #将空行删除  drop系列 axis 相反 0表示行

技术分享图片

 方式2:

  • dropna:可以直接将缺失的行或者列进行删除
df.dropna(axis=0)                      #可以直接将缺失的行或者列进行删除 
技术分享图片

对缺失值进行覆盖

  • 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]
df
技术分享图片

 


 

#检测哪些行存有重复的数据
df.duplicated(keep=‘first‘)      # 保留第一行值 以第一行为参照模板

技术分享图片

 

 df.loc[~df.duplicated(keep=‘first‘)]

 技术分享图片

 


 

#一步到位删除
df.drop_duplicates(keep=‘first‘)

技术分享图片

 

处理异常数据

  • 自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,然后将C列中的值大于其两倍标准差的异常值进行清洗

 

df = DataFrame(data=np.random.random(size=(1000,3)),columns=[A,B,C])
df.head()
技术分享图片

 


 

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

0.5664309886908782
 
df.loc[~(df[‘C‘] > twice_std)]
技术分享图片

 


 

 

 

 

 

基于pandas的数据清洗

原文:https://www.cnblogs.com/linranran/p/13301485.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!