首页 > 其他分享 >【pandas小技巧】--缺失值的列

【pandas小技巧】--缺失值的列

时间:2023-08-07 09:45:32浏览次数:33  
标签:how -- nan 缺失 df np pandas axis

在实际应用中,数据集中经常会存在缺失值,也就是某些数据项的值并未填充或者填充不完整。
缺失值的存在可能会对后续的数据分析和建模产生影响,因此需要进行处理。

pandas提供了多种方法来处理缺失值,例如删除缺失值、填充缺失值等。
删除缺失值可能会导致数据量减少,填充缺失值则能够尽量保留原始数据集的完整性,从而提高数据分析和建模的准确性和可靠性。

当数据集中存在缺失值时,我们通常需要进行以下操作:

  1. 检查缺失值的数量和分布情况,了解缺失值对数据的影响程度。
  2. 根据数据的类型和业务需求,选择合适的缺失值处理方法,并对缺失值进行处理。
  3. 在处理缺失值的同时,要注意保持数据集的一致性和完整性。
  4. 处理完缺失值后,可以进行后续的数据分析和建模,从而得出更准确和可靠的结论。

1. 缺失值统计

首先我们随机创建一个包含缺失值的测试数据集,这里用到之前介绍过的创建测试数据的技巧。

import pandas as pd

def get_random_missing_data():
    df = pd.util.testing.makeMissingDataframe()
    return df[df.isna().any(axis=1)]

df = get_random_missing_data()
df

image.png

这里我封装了一个简单的函数get_random_missing_data,通过这个函数,可以创建一个每行至少有一个缺失值的数据集。
注意:这是随机创建的数据集,所以每次运行的结果会不一样。

统计缺失值很简单,首先通过isna函数找出所有缺失的值,然后可以使用sum或者mean来统计缺失的数量和比例。

df.isna().sum()

image.png
sum函数返回的是每一列缺失值的数量。

df.isna().mean()

image.png
mean函数返回的值可以看做每一列缺失值占的比例。

2. 删除缺失值

处理缺失值时,有些场景为了保证数据的完整性,只能删掉有缺失的数据。
删除缺失值有2个重要的参数:how axis

how有2个可选值:

  1. any:这是默认值,表示行数据或者列数据中有一个缺失值,就删除此行或此列
  2. all:表示行数据或者列数据中所有值都缺失时,才删除此行或此列

axis也有2个可选值:

  1. 0 或 index:按行判断是否有缺失值
  2. 1 或 columns:按列判断是否有缺失值

how="any"axis=0的情况:每数据中只要有一个缺失值就删除该

df = pd.DataFrame(
    {
        "A": [1, 2, 3, np.nan],
        "B": [1, np.nan, 3, 4],
        "C": [1, 2, np.nan, 4],
        "D": [1, 2, 3, 4],
    }
)

df.dropna(how="any", axis=0)

image.png

how="all"axis=0的情况:每数据中,全部值都缺失的才删除。

df = pd.DataFrame(
    {
        "A": [1, np.nan, 3, np.nan],
        "B": [1, np.nan, 3, 4],
        "C": [1, np.nan, np.nan, 4],
        "D": [1, np.nan, 3, 4],
    }
)

df.dropna(how="all", axis=0)

image.png

how="any"axis=1的情况:每数据中只要有一个缺失值就删除该

df = pd.DataFrame(
    {
        "A": [1, 2, 3, np.nan],
        "B": [1, np.nan, 3, 4],
        "C": [1, 2, np.nan, 4],
        "D": [1, 2, 3, 4],
    }
)

df.dropna(how="any", axis=1)

image.png

how="all"axis=1的情况:每数据中,全部值都缺失的才删除。

df = pd.DataFrame(
    {
        "A": [np.nan, np.nan, np.nan, np.nan],
        "B": [1, np.nan, 3, 4],
        "C": [1, 2, np.nan, 4],
        "D": [1, np.nan, 3, 4],
    }
)

df.dropna(how="all", axis=1)

image.png

3. 填充缺失值

填充缺失值一般使用fillna函数指定填充什么样的值。
比如:

df = pd.DataFrame(
    {
        "A": [1, 2, 3, np.nan],
        "B": [1, np.nan, 3, 4],
        "C": [1, 2, np.nan, 4],
        "D": [1, 2, 3, 4],
    }
)

df.fillna(-1)

image.png
这里是用 -1 来填充的,根据实际情况可以使用任意合适的值来填充。

除了 fillna 函数之外,还有一个interpolate函数,能够更加合理的填充缺失值。

df = pd.DataFrame(
    {
        "A": [1, 3, 4, np.nan],
        "B": [2, np.nan, 2, 4],
        "C": [3, 3, np.nan, 3],
        "D": [4, 1, np.nan, 4],
    }
)

df.interpolate()

image.png
每个缺失值都是它上下两行的值的平均值

如果只有上面行的值,那就直接用上面行的值。
这里有个注意的地方:如果是第一行有缺失的话,那么是无法填充的。
比如:

df = pd.DataFrame(
    {
        "A": [np.nan, 3, np.nan, np.nan],
        "B": [2, np.nan, 2, 4],
        "C": [3, 3, np.nan, 3],
        "D": [4, 1, np.nan, 4],
    }
)

df.interpolate()

image.png
第一行的缺失值没有上一行可以参照,还是维持原来缺失的状态。
所以使用 interpolate 进行填充时,注意第一行的缺失值状态,可以用 fillna 先处理第一行。

标签:how,--,nan,缺失,df,np,pandas,axis
From: https://www.cnblogs.com/wang_yb/p/17610655.html

相关文章

  • 1C/S架构与B/S架构
    C/S架构是客户端和服务器架构按照历史的变迁分两层C/S架构和三层C/S架构。两层C/S架构是胖客户端和服务器(数据库):业务逻辑都在客户端上,当需要进行业务逻辑更新时,就得对客户端更新,若客户端数量多时,这个升级维护困难,因为要一个客户端一个客户端去更新。于是就有了三层C/S架构:瘦客......
  • Unity的IUnityLinkerProcessor:深入解析与实用案例
    UnityIUnityLinkerProcessorUnityIUnityLinkerProcessor是Unity引擎中的一个接口,它允许开发者在Unity项目构建时对代码进行链接处理。这个接口可以用来优化项目构建大小,减少不必要的代码和资源,提高项目的性能和加载速度。接口定义IUnityLinkerProcessor接口定义如下:namespac......
  • 统计字母
    #include<iostream>#include<cstdio>usingnamespacestd;intmain(){charchl[1000],ch2;intnum[26],i,k;for(i=0;i<26;i++){num[i]=0;}gets(chl);i=0;while(chl[i]!='\0'){......
  • 使用SQL 统计表最大值,最小值,平均值,中位数值
    问:有一个postgres数据表,表中有update_time,create_time关于时间戳的字段,选择某个时间段,计算出update_time减去create_time的值做为耗时时间的字段duration_time,统计出在这段时间内耗时时间的平均值,中位数值,最大值,和最小值,请问如何通过sql语句实现此统计?答:您好!您可以使用以下......
  • 小米手机锁屏设置了密码,设置了指纹,但是锁屏无效,直接进入桌面,不需要输入密码或指纹
    问题:小米手机锁屏无效?小米手机锁屏设置了密码,设置了指纹,但是锁屏无效,直接进入桌面,不需要输入密码或指纹?小米手机防误触怎么设置?起因:手机放在口袋里,经常会误触。导致手机自动解锁,然后打开各种应用,比如:微信,和拼多多,然后莫名其妙自动下单,导致经常买了一些不需要的东西,东西收到......
  • 删除事件
        ......
  • 【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I
    【LGR-148-Div.3】洛谷基础赛#1&MGOIRoundIT1luoguP9502『MGOI』SimpleRoundI|A.魔法数字\(100pts\)水题,场切了。#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definesortstable_sort#defineendl'\n'intmain(){ ......
  • mysql突然断电,无法启动问题, redo log 无法恢复 mysqld启动不了 Plugin 'InnoDB' init
    环境:CentOS7.x、MySQL5.7其实造成这种问题的原因有很多种,但是不管是什么问题,最终的原因一般是redolog造成的问题。为什么说是redolog造成的呢,因为redolog对应的文件就是两个ib_logfile开头的文件:ib_logfile0、ib_logfile1;下面的问题都是和ib_logfile有关。MySQL......
  • Apache HTTPD换行解析漏洞(CVE-2017-15715)
    ApacheHTTPD换行解析漏洞(CVE-2017-15715)【项目中遇到】ApacheHTTPD是一款HTTP服务器,它可以通过mod_php来运行PHP网页,其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将按照PHP后缀进行解析,导致绕过一些服务器安全策略。1.环境搭建cdhttpd/CVE-2017-15715/doc......
  • 第六章 内建自测试
    1内建自测试概念1.1背景    1.ATE测试成本    2.Memory测试的特殊性Memory内部需要测试的单元多Memory内部单元规整    3.客户对于在线测试的需求:汽车电子的可靠性要求1.2基本流程StartBIST:外部控制信号,开始自测试TestController控制Pa......