pandas处理缺失值的10种策略

一、引言

在数据分析的世界里,数据清洗是一项至关重要的前期工作。它犹如给食材去皮、洗净、切片,让它们成为一道道美味佳肴的原材料。对于Python初学者来说,掌握如何使用强大的Pandas库处理数据中的缺失值是迈向数据清洗高手的第一步。本文将带领您探索使用Pandas处理缺失值的10种策略,让您在实战中游刃有余。

二、准备工作:导入Pandas库与加载示例数据集

首先,确保已经安装了Pandas库,可通过以下命令进行安装:

pip install pandas

然后,我们创建一个简单的示例数据集example_data.csv,其中包含一些故意引入的缺失值(用NaN表示),以方便演示各种处理策略。以下代码导入Pandas库并加载数据集:

import pandas as pd# 加载示例数据集
df = pd.read_csv("example_data.csv")
print(df)

输出结果类似如下:

   A    B    C    D
0  1  2.0  NaN  foo
1  2  NaN  7.0  bar
2  3  4.0  5.0  baz
3  4  NaN  6.0  qux
4  5  6.0  NaN  quux

接下来,我们将逐一介绍并演示10种处理缺失值的策略。

三、策略1:直接删除含有缺失值的行

有时,当数据集中存在大量缺失值,且对分析影响较小时,可以选择直接删除含有缺失值的行。Pandas的dropna()方法可以轻松实现这一操作:

# 删除含有缺失值的行
df_cleaned = df.dropna()
print(df_cleaned)

注意:删除数据需谨慎,确保缺失值的分布不会严重影响分析结果。

四、策略2:删除含有缺失值的列

如果某一列的缺失值过多,可能对该列的分析价值产生较大影响,这时可以考虑删除整列。只需将dropna()方法的axis参数设置为1(代表列):

# 删除含有缺失值的列
df_cleaned = df.dropna(axis=1)
print(df_cleaned)

五、策略3:填充缺失值(替换为固定值)

若希望将所有缺失值替换为某个固定的值(如0、-1或特定字符串),使用fillna()方法即可:

# 将所有缺失值替换为0
df_filled = df.fillna(0)
print(df_filled)

六、策略4:基于前一个非空值进行向前填充

对于时间序列数据或其他有序数据,有时会采用“前一个非空值”来填充缺失值。只需将fillna()方法的method参数设为ffill(forward fill):

# 基于前一个非空值进行向前填充
df_filled = df.fillna(method='ffill')
print(df_filled)

七、策略5:基于后一个非空值进行向后填充

与向前填充相反,向后填充(backfill)使用的是“后一个非空值”。只需将fillna()方法的method参数设为bfill

# 基于后一个非空值进行向后填充
df_filled = df.fillna(method='bfill')
print(df_filled)

八、策略6:基于平均值、中位数或众数填充缺失值

对于数值型数据,可以计算列的平均值、中位数或众数,然后用这些统计量填充缺失值。分为两步:

  1. 计算统计量:
mean_A = df['A'].mean()
median_B = df['B'].median()
mode_C = df['C'].mode()[0]
  1. 使用fillna()方法进行填充:
df_filled_A = df['A'].fillna(mean_A)
df_filled_B = df['B'].fillna(median_B)
df_filled_C = df['C'].fillna(mode_C)

九、策略7:使用插值法填充缺失值

对于连续的数值型数据,可以使用插值法进行填充。Pandas支持线性插值和时间序列插值:

  1. 线性插值:使用interpolate()方法,无需额外参数:
df_interpolated = df.interpolate()
print(df_interpolated)
  1. 时间序列插值:假设数据集有时间戳列(如datetime),则可使用method='time'参数:
df['datetime'] = pd.to_datetime(df['datetime'])  # 转换为datetime类型
df_interpolated = df.set_index('datetime').interpolate(method='time').reset_index()
print(df_interpolated)

十、策略8:使用特定函数填充缺失值

如果您想根据数据特点自定义填充规则,可以编写一个函数,然后通过applymap()方法应用到整个数据框:

def custom_fillna(x):if isinstance(x, float) and pd.isnull(x):return 0  # 对浮点数缺失值填充0else:return x  # 其他情况保持原样df_custom_filled = df.applymap(custom_fillna)
print(df_custom_filled)

十一、策略9:利用机器学习模型预测缺失值

对于复杂的数据集,可以训练一个简单的机器学习模型(如线性回归)来预测缺失值。以下是一个简化的示例:

from sklearn.linear_model import LinearRegression# 假设D列有缺失值,用A、B、C列作为特征预测D列
X = df.dropna(subset=['D'])[['A', 'B', 'C']]
y = df.dropna(subset=['D'])['D']model = LinearRegression().fit(X, y)# 预测并填充缺失值
df['D_pred'] = model.predict(df[['A', 'B', 'C']])
df['D_filled'] = df['D'].fillna(df['D_pred'])
print(df)

十二、策略10:多重填充策略的组合运用

实际工作中,可能需要结合多种策略灵活应对不同情况。例如,先用众数填充类别变量,再用线性插值填充数值变量:

df_filled_categories = df.fillna(df.mode().iloc[0])
df_filled_numerics = df_filled_categories.interpolate()
print(df_filled_numerics)

十三、结论与实践建议

处理数据中的缺失值没有绝对的“最佳实践”,应根据数据特性和分析目标灵活选择合适的方法。理解并熟练运用Pandas提供的工具,结合实际情况创新组合策略,将使你在数据清洗的道路上更加自信从容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——进程信号

目录 一、信号的理解 二、信号的种类 2.1 标准信号 (1-31) 2.2 实时信号 (通常是34及以上) 三、信号的产生 3.1 用户通过终端产生信号 3.1.1 signal 函数 3.1.2 demo 测试 3.1.3 demo 现象 3.2 通过系统函数产生信号 3.2.1 demo 测试 3.3 由软件条件产生信号 3.3.1…

面向浏览器端免费开源的三维可视化编辑器,包含BIM轻量化,CAD解析预览等特色功能。

ES 3DEditor 🌍Github地址 https://github.com/mlt131220/ES-3DEditor 🌍在线体验 https://editor.mhbdng.cn/#/ 基于vue3与ThreeJs,具体查看Doc 主要功能: 模型导入展示,支持OBJ、FBX、GLTF、GLB、RVT、IFC、SEA、3…

Class类-super关键字

在编程中,super关键字通常用于引用父类(超类)的属性或方法。以下是在不同语言中super关键字的使用示例: JavaScript (ES6 Class Syntax) Javascript 1class Parent { 2 display() { 3 console.log("Parent class…

LeetCode算法题:三数之和

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a b c 0 ?请找出所有和为 0 且 不重复 的三元组。 示例 1: 输入:nums [-1,0,1,2,-1,-4] 输出&#xff1a…

如何将Docker容器打包并在其他服务器上运行

如何将Docker容器打包并在其他服务器上运行 我会幻想很多次我们的相遇,你穿着合身的T恤,一个素色的外套,搭配一条蓝色的牛仔裤,干净的像那天空中的云朵,而我,还是一个的傻傻的少年,我们相识而笑…

有没有适合女性做的副业?盘点9个适合女生做的赚钱兼职副业

亲爱的女神们,你们是否也想在忙碌的生活中寻找一些额外的乐趣和收入呢?今天,就为大家揭秘九种特别适合女性的副业,让你在追求美丽的同时,也能轻松赚取零花钱,秒变“小金库”! 一、宅富社任务赚钱…

BGP策略实验

BGP策略实验 1.拓扑 2.要求 1.使用配用preva1策略,确保R4通过R2到达192.168.10.0/24 2.用AS Path策略,确保R4通过R3到达192.168.11.0/24 3.配置MED策略,确保R4通过R3到达192.168.12.0/24 4.使用Local Preference策略,确保R1通…

关于linux的防护,以及群集你要知道的有哪些9-Redis群集

1、数据库的类型: (1)关系型数据库:Oracle、MySQL、SQL server、DB2 (2)非关系型数据库:Redis、MongDB、Hbase、CouhDB 2、Redis的优点 具有极高的数据读写速度 支持丰富的数据类型 支持数据的…

Sentinel的隔离和降级

文章目录 1、概念简介2、FeignClient整合Sentinel2.1、修改配置,开启sentinel功能2.2、编写失败降级逻辑2.3、总结 3、线程隔离(舱壁模式)3.1、线程隔离的实现方式3.2、sentinel的线程隔离1)配置隔离规则2)Jmeter测试 …

南加州大学字节提出MagicPose,提供逼真的人类视频生成,实现生动的运动和面部表情传输,以及不需要任何微调的一致的野外零镜头生成。

MagicPose可以精确地生成外观一致的结果,而原始的文本到图像模型(如Stable Diffusion和ControlNet)很难准确地保持主体身份信息。 此外,MagicPose模块可以被视为原始文本到图像模型的扩展/插件,而无需修改其预训练的权重。 相关链接 论文链…

k8s pv 一直是release状态

如下图所示,pv 一直是release状态 这个时候大家可能就会想到现在我的 PVC 被删除了,PV 也变成了 Released 状态,那么我重建之前的 PVC 他们不就可以重新绑定了,事实并不会,PVC 只能和 Available 状态的 PV 进行绑定。…

Vue 对象

在 Vue.js 中,操作对象是常见的任务之一。Vue 提供了许多方法和指令来方便地操作对象,包括动态添加属性、遍历对象、响应式更新等。以下是一些常见的对象操作及其详细说明和示例。 创建对象 在 Vue 组件的 data 中创建对象: export defaul…

children和childrenNodes及nodeValue

在JavaScript中,尤其是当处理DOM元素时,children[0] 和 childNodes[0] 确实存在区别,尽管它们看起来都像是访问某个元素子节点的方式。以下是它们之间的主要区别: children 属性 children 属性是一个只读的HTMLCollection&#…

SQL 面试系列(一)【留存率问题】

前言 在学 HQL 之前是不太了解 SQL 的,以为 SQL 只可以实现 CRUD ,直到面试的公司让我下去多了解一些 SQL ,我才最近开始再次深入学习 MySQL 和 Oracle。而且越学越发现 SQL 真的是一门很有深度的语言,我以前的使用只是皮毛而已&a…

如何远程连接默认端口?

远程连接是指通过网络实现两个或多个计算机之间的连接和通信。在进行远程连接时,使用的端口号是一个重要的参数。端口号是计算机上正在运行的特定应用程序的标识符。每个应用程序都会监听一个或多个特定的端口号,以便接收来自其他计算机的连接请求&#…

Android正向开发实现客户端证书认证

前言 如果第三方模块被混淆,那hook方式均不能生效。这时就需要根据系统包去定位校验的函数,因此需要对安卓开发者是如何实现客户端证书校验的有一定了解,接下来就介绍这部分内容。 开发者实现客户端证书校验的本质是:证书/密钥 + 代码。 在形式上有:证书校验、公钥校验和…

【内存泄漏Bug】registerReceiver Are you missing a call to unregisterReceiver()异常分析及解决

问题描述 开发一款WIFI管理APP,再wifi列表页面注册了广播监听,监听网络变化,页面是常驻内存的,跳转到其他app或者其他页面的时候,此页面存在被系统销毁的可能。 android.app.IntentReceiverLeaked: Activity com.xx.a…

Object类,你学会了吗?

在 Java 编程中,Object 类是所有类的根类,了解 Object 类的原理和功能对于成为一名优秀的 Java 程序员至关重要。 本文将深入介绍 Object 类,帮助准备面试的程序员更好地理解这个关键的 Java 类。 什么是 Object 类? Object 类位于 java.lang 包中,是 Java 中的基本类之…

Leetcode 112:路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 思路:遍历存储每条路径。当前节点为叶子节点时,求和。并判断是否等于目标…

【Linux】:进程优先级

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux进程优先级的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到…