pandas 删除连续缺失超过n行的数据

问题场景:

在处理dataframe时,可能会遇到某一列/ 几列数据连续缺失的情况,连续缺失行数较少的情况可以考虑插值填充,连续缺失行数过多时,可能需要将连续缺失值所在行的数据完全删除。

如何快速删除连续缺失的多行数据,并且缺失的阈值可选择的?

不想看原理的,可以直接跳到”函数封装”

解决思路:

pandas 删除连续缺失超过n行的数据

假设有形式如上的dataframe,绿色代表非空值,灰色代表nan值,删除连续缺失≥n行的思路如下:

首先,对每一列而言,筛选出连续缺失 ≥ 阈值n的数据,

然后获取其对应的index值,并保存到一个列表list_missing中,

对每一列数据进行如上操作,并根据列表储存的index值,删除原dataframe对应行数据。

代码详解

step1.读取数据

import pandas as pd
import numpy as np

生成数据
NaN = np.nan
data = pd.DataFrame({"SO2":[10, 5, 5, NaN, 9, NaN, NaN, NaN],
                     "NO2":[12, NaN, NaN, 10, 10, 23, 15, 9],
                     "CO2":[15, 23, NaN, 24, 25, NaN, NaN, NaN],
                     "O3":[17, 23, 33, NaN, NaN, NaN, 5, 22]
                    })
data = data.fillna("*")  # 为什么要替换空值,后文会讲

本例数据形式如下:

pandas 删除连续缺失超过n行的数据

这里将空值用 “*” 替换,原因后面会讲,另外,填充的值不能和非缺失值重复。

step2.提取dataframe的列名

key = "SO2"
df1 = data[key].to_frame() # series转换为dataframe

pandas 删除连续缺失超过n行的数据df1的形式如左图所示。

step3.将连续重复出现的数据聚合

这里会用到如下代码,将逐层讲解

df1[key].shift() != df1[key]

df1[key].shift()是将每一行的值下移动一行,
可以看到,第一行变为NaN,其余值依次往下移动一位。

pandas 删除连续缺失超过n行的数据 原来的形式pandas 删除连续缺失超过n行的数据 后来的
df1[key].shift() != df1[key]的判断结果如下:

pandas 删除连续缺失超过n行的数据

需要注意的是,np.nan不等于np.nan,这就是之前要对缺失值进行替换的原因。

后面再加上 cumsum()

(df1[key].shift() != df1[key]).cumsum()

cumsum()给出一个非降序的id序列,其中每个id表示一个具有相同值的连续块(在对布尔值求和时,True被认为是一,而False被认为是零)

pandas 删除连续缺失超过n行的数据

通过groupby(),将数据按照相同长度进行聚合,并使用filter()筛选出连续重复长度≥设定阈值的数据。

threshold = 2  # 设置连续缺失阈值
df2 = df1.groupby((df1[key].shift() != df1[key]).cumsum()
                 ).filter(lambda x: len(x) >= threshold)

pandas 删除连续缺失超过n行的数据
df3 = df2[df2[key].isin(["*"])]

pandas 删除连续缺失超过n行的数据

step4.获取连续缺失行的index值

 list1 = df3.index.tolist()

pandas 删除连续缺失超过n行的数据

对每一列都进行如上处理,获得所有连续缺失行index,最后用drop同意删除就可以了,下面对前文所述进行封装,以便调用。

函数封装

def missing_treat(df, key, fill, threshold):
    df1 = df[key].to_frame()
    df2 = df1.groupby((df1[key].shift() != df1[key]).cumsum()).filter(lambda x: len(x) >= threshold)
    list1 = df2[df2[key].isin([fill])].index.tolist()
    return list1

函数的参数有
df: 原始的dataframe(需要替换np.nan后的)
key: dataframe的列名
fill: 对np.nan进行替换的值
threshold:连续缺失阈值,连续缺失行≥threshold的,删除

调用一下,

数据准备
NaN = np.nan
data = pd.DataFrame({"SO2":[10, 5, 5, NaN, 9, NaN, NaN, NaN],
                     "NO2":[12, NaN, NaN, 10, 10, 23, 15, 9],
                     "CO2":[15, 23, NaN, 24, 25, NaN, NaN, NaN],
                     "O3":[17, 23, 33, NaN, NaN, NaN, 5, 22],
                    })
keys = []
for key in data.columns:      # 读取列名
    keys = np.append(keys, key)

df0 = data.fillna("*")        # 缺失值填充

res = []
for key in keys[2:]:
    list_missing = missing_treat(df=df0, key=key, fill="*", threshold=2)
    res = sorted(list(set(res).union(list_missing)))  # 对所有list_missing求并集

data.drop(index=res, inplace=True)  # 根据index删除原dataframme对应行
data

pandas 删除连续缺失超过n行的数据

参考

【pandas】三行代码优雅实现删除连续重复的多行

上面的参考最后用了merge,实际使用时,发现会出问题,在一些特定情况(包括本例)不能达到使用要求,所以改用记录index来删除。

实现方式肯定不止一种,文章也可能存在错误,欢迎大家批评交流。

Original: https://blog.csdn.net/qq_57313910/article/details/126769783
Author: bug嘛我经常写
Title: pandas 删除连续缺失超过n行的数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/674922/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 语音降噪-维纳滤波

    在输入信号通过线性时不变系统后,产生输出信号,使输出信号尽可能接近期望信号,并使其估计误差最小。能够使这种估计误差最小化的最优滤波器称为维纳滤波器。 [En] After the …

    人工智能 2023年5月27日
    083
  • React-性能优化(不用memo)

    相信大家在使用React时,经常会遇到页面出现重复渲染的情况,有时候,可能渲染的数据不多,从视觉上感觉不到性能的消耗,但是有时候却很尴尬,比如渲染一个可编辑的列表,当列表的行数稍微…

    人工智能 2023年7月30日
    039
  • 把dataframe 保存进excel

    import pandas as pdimport xlwtdf = pd.read_excel(r’C:\Users\admin\Desktop\历史文件\1.1-7…

    人工智能 2023年7月7日
    085
  • 基于遗传算法车辆路径问题(VRP)

    一、车辆路径问题简介与求解要求 交通运输是国民经济的动脉,各种运输方式在日常运输营运管理工作中都要面对这样一个共同的问题:如何为载运工具(汽车,列车,轮船和飞机,统称为车辆)确定行…

    人工智能 2023年7月27日
    066
  • 空间转录组 CCST

    今天接着写CCST,CCST借鉴了DGI模型,总体来说是构建了邻接矩阵,然后四层GCN,损失函数是信息熵,与spaGCN有点相似性,后者是计算KL离散度。最后根据模型提取的特征进行…

    人工智能 2023年6月3日
    077
  • Scikit-learn 与 TensorFlow不是一回事:详细对比

    什么是 Scikit-Learn? Scikit-learn 是一个开源 Python 库,包括各种无监督和监督学习技术。它基于 Matplotlib、Pandas 和 NumPy…

    人工智能 2023年5月23日
    062
  • 机器学习的L1、L2损失函数

    ** 问题一:损失函数是什么? ** 损失函数就一个具体的样本而言,模型预测的值与真实值之间的差距。哦哦,这句话怎么理解呢,就是我们使用自己的算法模型,然后就是自己的模型产生了一个…

    人工智能 2023年7月21日
    039
  • 13-ES5和ES6基础

    每一个函数里面都有一个this,可以直接使用;不同的函数调用方式,里面this的含义是不同的 function fn(){ console.log(this); } fn(); d…

    人工智能 2023年6月26日
    0110
  • 朴素贝叶斯 实现 垃圾邮件分类

    1.贝叶斯的基本思想: 已知公式: p(y|x)=p(x|y)*p(y)/p(x) 可以将x看做特征向量,y为结果,那么p(y|x)就是在x特征出现的情况下,结果为y的概率。 在机…

    人工智能 2023年6月25日
    081
  • Jupyter notebook 详细安装步骤

    前言: 在安装Jupyter notebook 之前,确认您已安装python编译器(点击进入python官网) 一、开始安装 1、打开cmd命令窗口 在键盘上点击 win+r 键…

    人工智能 2023年7月3日
    0125
  • nosql期末

    1、NoSQL一词表示的含义是()。 没有SQL不是SQL非关系型数据库 (答案)关系型数据库 2、大数据时代,数据的存储与管理不包括哪些要求?() 数据管理系统具有很高的扩展性,…

    人工智能 2023年6月27日
    0156
  • python-新闻文本分类详细案例-(数据集见文末链接)

    文章目录 分析思路 所用数据集 一、导入相关包 二、数据分析 * 1.读取数据 2. jieba分词并去除停用词 3. TF-IDF 4. 网格搜索寻最优模型及最优参数 5. 预测…

    人工智能 2023年6月15日
    065
  • CV深度学习项目调试开发过程中报错记录【持续更新】

    1、加载读取本地数据集报错:can’t open/read file: check file path/integrity can’t open/read file: …

    人工智能 2023年6月16日
    0120
  • 模型保存的格式.h5和.pb对比

    .h5是一种存储结构化数据(在这种情况下是神经网络)的方法,目前已由Google概述. 简单的 class包含两个字段,您可以使用多种受支持的语言(例如 C++, Go)之一将其加…

    人工智能 2023年5月23日
    097
  • 【数字图像处理】第3章:图像基本运算 —— 03 邻域 & 模板运算

    数字图像处理——图像基本运算——邻域概念 & 模板运算 1、邻点及邻域 点运算是对图像中每个像素点进行运算,其他点的值不会影响到该像素点,如图像的几何变换、灰度级变换等; …

    人工智能 2023年6月18日
    083
  • LPC2478(22)IAP在线升级

    目录 1、开发环境 2、特性 3、IAR编译器的相关文件 3.1、icf文件 3.2、IcfEditorFile文件内容 3.3、ddf文件 3.4、board文件 4、IAP相关…

    人工智能 2023年6月29日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球