numpy、pandas实用总结(遍历、重复值、缺失值、异常值、数据过滤、数据清洗)

前言

  • 最近工作中经常实用pandas,然而,却发现自己对于pandas的掌握并没有想象中的好,很多pandas的函数和用法,自己都不是特别的熟练,特此总结一下最近经常会使用的pandas用途和函数,增强记忆。

pandas用途之DataFrame遍历

  • 按照行对于DataFrame进行遍历,得到每一行,然后对于行进行操作,取每一列的单个数据
    for index,row in df.iterrows():
    	print(row['列名'],row['列名'])
    
  • 如果需要得到每一行的每列的数据进行计算,则需要row[‘列名’].iloc[0]取出行中的单个元素
  • 因为,单纯的取出row[‘列名’]是Series类型,会带有Series类型的一些索引等内容。

pandas用途之DataFrame数据查询重复,去除重复

  • DataFrame数据查询和取出重复元素,都是根据df.duplicated来实现的
  • 使用df.duplicated()来查询重复值,返回布尔类型的值
    • 参数:subset,设置判断重复的时候,按照哪些列进行判断。
      • 可以使用列表的方式设置,subset = [“列a”,“列b”]
      • 可以使用字符串的方式定义,subset = “列a”
    • 参数:keep,设置判断重复的时候,保留项
      • keep = “first”, 保留第一项
      • keep = “last”, 保留最后一项
      • keep = False,一个都不保留
  • 使用df.drop_duplicates()来删除重复值
    • 参数:subset,设置判断重复的时候,按照哪些列进行判断。
      • 可以使用列表的方式设置,subset = [“列a”,“列b”]
      • 可以使用字符串的方式定义,subset = “列a”
    • 参数:keep,设置判断重复的时候,保留项
      • keep = “first”, 保留第一项
      • keep = “last”, 保留最后一项
      • keep = False,一个都不保留

pandas用途之DataFrame数据查询缺失值,去除缺失值

  • 查询缺失值
    • 使用df.isnull().all(),判断dataframe每一列,哪一列的值全为空
    • 使用df.isnull().any(),判断dataframe每一列,哪一列的值有空值
    • 也可以单独去判断某一列是不是空值
      • df[‘列名’].isnull().any()
      • df[‘列名’].isnull().all()
    • 使用 np.sum()配合df[‘列名’].isnull()来进行判断某列空值的数量
    • 使用 df.info(),可以得到dataframe中每一列的值有多少个,然后非空的值有多少个,是什么类型
    • df[df.duplicated(keep=False)], 查看具体是哪些值是重复的
  • 删除缺失值
    • 使用 df.dropna() 来删除缺失值
    • 参数详解:
      • how,指定什么情况下可以删除,值的选择有俩个
        • any,只要有一个就删除一行
        • all, 只有整行都是空值,才会删除
      • axis,指定删除行还是删除列
        • 0,删除行(默认)
        • 1,删除列
      • thresh, 指定非空数量,只要某行某列只要是达到这个数量,就保留
      • inplace,设置是否就地修改,True 或者 False
      • subset, 删除的时候,考虑其他轴方向的子集,比如说,删除行的时候,那么,我们设置 subset = [1,2],那就只会判断1,2俩列
    • 填充缺失值
      • 使用df.fillna() 来填充固定值
      • 参数详解
        • value = ‘啥啥啥’,
          • 使用固定的值来填充
          • 也可以 字典来指定某一列的值,来填充,字典的key指定列标签,值指定value
            • value = {3:300,4:300}
        • method,俩个值
          • ffill,填充上一个有效的值
          • bfill,填充下一个有效的值
        • limit,限制填充的数量
          • 在value的时候, limit是限制的 最大的填充的数量,就是填充的总量
          • 在method 的时候,是限制的连续的填充的数量
        • inplace,设置是否就地修改

pandas用途之数据异常值、无效值的处理

  • 删除处理,实际上就是通过数据的过滤实现,删除超过100,小于0的数据
    • df= df[(df[“age”] >= 0) & (df[“age”] <= 100)]
  • 按照条件修改为指定的值,< 0 的值,就修改为0,大于100的值,就修改为 100
    • df[“age”] = np.where(df[“age”] < 0, 0, df[“age”])
    • df[“age”] = np.where(df[“age”] > 100, 100, df[“age”])

数据的过滤与抽取

  • 数据的过滤与抽取,目前我了解的有三种方式
  • 第一种,利用布尔数组过滤
    • new_df = data[data[3] >= 200]
  • 第二种,利用query来过滤数据
    • df.query(“value1 >= 200 and value1 <= 300”)
    • value1为 df中 实际的合法列名
  • 第三种,利用sample()来随机抽取数据
    • df.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
    • n:表示你要随机抽取几行数据,比如你要抽取10行,n=10。不能与frac同时使用
    • frac:浮点型,可选。表示抽取数据的百分比,当不确定n的具体值的时候使用。不能与n同时使用
    • replace:布尔值,可选。
      • 原来的DataFrame是否被抽取的数据替换,默认为False.
      • 如果n取值大于原DataFrame的长度, replace为True,可返回结果。
      • 否则会因dataFrame长度不够而报错。
    • weights:权重,字符串或者数组格式,可选。通过设置不同的权重可以增加相应数据被选中的概率。
    • random_state:随机种子数
    • axis: 当抽取数据的时候是从行中抽取数据,还是从列中抽取数据。
      • 0表示纵向坐标轴
      • 1表示横向坐标轴

数据清洗之连续重复值值删除

  • 在工作的时候,在删除重复之时,发现,仅仅使用drop_duplicated()无法满足需求,会有一种情况,按照业务的需求,有些列的数据,要是根据时间的发展,重复60次以上的数据才被视为重复数据,删除这样的重复数据,就需要自己去实现,由于时间的原因,自己用了一种很笨的方式,去实现了一下。
  • 整体的思路
    遍历数据集,用数据集的每一行数据的要去除重复的字段 的值  与之后的行中的值对比,看看是不是连续重复,要是 一直是 连续重复,就记录下来,要是途中发现有一个是不重复的,就跳出,然后下一行,每次每个数字统计完毕之后,都需要看看列表里边的数据,是不是超过我们的设定,要是超过了,就说明当前的这些数据是需要删除的,然后返回索引
    
    # 按照时间排序
    context_4 = context_3.sort_values(by='dtime')
    # 重新设置索引,让行索引从0开始,依序往下
    context_5 = context_4.reset_index(drop=True)
    def chafen(context,key,n):
        lis = []
        # 遍历数据集
        for index, row in context.iterrows():
            nval = row[key]
            for i in range(index,context.shape[0])
                if (nval- context[key].iloc[i]) == 0:
                    lis.append(i)
                else :
                    break
            if len(lis) < n:
                lis.clear()
        return lis
    context_6_1 = context_5.drop(set(chafen(context_5,"Illumination",10)))
    

数据清洗之上下四分位

  • 实际的业务需要,将数据集根据某一个特征进行上下四分位清洗,得到清洗后的数据集
  • 第一步,从数据集中得到具体的特征的值
  • 第二步,根据特征划分区间
    • 生成区间列表,生成0 到 特征的最大值之间,步长为 50的列表
    • 生成标签列表,生成对应数量的标签名称,存储着 每个标签名称的列表
    • 使用cut函数将特征按照 区间列表对应的名称划分为 不同的区间,实际上是得到了一个Series,里边原本的特征的值全部都 显示为 对应的 区间标签名称
    • 给数据集新增以列表,为 替换为标签值的 特征列
  • 第三步,将 数据集按照区间列进行 分组,
  • 第四步, 按照功率进行上下四分位,
  • 第五步, 生成 和 区间数量等长的 数组
  • 第六步, 循环遍历标签, 分别将 功率的上下四分位 的数据放入对应的 numpy中
  • 第七步, 生成 一个 dataframe,将标签,a25,a75的数据放入
  • 第八步,将生成的四分位数据和 原数据集进行合并。 根据区间的标签列合并
  • 第九步,真正的开始清洗
    • 此时得到的是原本的数据集每一条数据,都打上了标签,是属于哪个类型,以及对应的上下四分位的值,然后我们就可以 实现清洗,只保留大于 a25,以及 小于 a75 的数据
    原文作者:勿语~
    原文地址: https://blog.csdn.net/qq_24499745/article/details/91494583
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞