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

pandas,技巧,缺失 · 浏览次数 : 105

小编点评

**缺失值处理方法** 在实际应用中,数据集中经常会存在缺失值,因此需要进行处理以确保数据的完整性和可靠性。 pandas 提供多种方法来处理缺失值,包括删除缺失值、填充缺失值等。 **1. 缺失值统计** * `df.isna().sum()`:返回缺失值的数量和总比例。 * `df.isna().mean()`:返回缺失值占的比例。 **2. 删除缺失值** * `df.dropna(how="any", axis=0)`:删除行数据中任何缺失值的行。 * `df.dropna(how="all", axis=0)`:删除行数据中所有缺失值的行。 **3. 填充缺失值** * `df.fillna(-1)`:填充缺失值以 -1。 * `df.fillna(0)`:填充缺失值以 0。 * `df.fillna(np.nan)`:填充缺失值以 np.nan。 **4. 考虑缺失值处理的顺序** * 首先考虑缺失值的数量和分布情况。 * 根据数据类型和业务需求,选择合适的缺失值处理方法。 * 对缺失值进行处理后,可以进行后续的数据分析和建模。 **5. 保持数据集的一致性和完整性** * 在删除或填充缺失值时,要注意保持数据集的一致性和完整性。 * 使用 `drop()` 方法删除缺失值时,可以使用 `axis=1` 参数指定处理列数据。 * 使用 `fillna()` 方法填充缺失值时,可以使用 `inplace=True` 参数指定对数据进行更改。

正文

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

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 先处理第一行。

与【pandas小技巧】--缺失值的列相似的内容:

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

在实际应用中,数据集中经常会存在缺失值,也就是某些数据项的值并未填充或者填充不完整。缺失值的存在可能会对后续的数据分析和建模产生影响,因此需要进行处理。 `pandas`提供了多种方法来处理缺失值,例如删除缺失值、填充缺失值等。删除缺失值可能会导致数据量减少,填充缺失值则能够尽量保留原始数据集的完整

【pandas小技巧】--日期相关处理

日期处理相关内容之前`pandas基础`系列中有一篇专门介绍过,本篇补充两个常用的技巧。 # 1. 多列合并为日期 当收集来的数据中,年月日等信息分散在多个列时,往往需要先合并成日期类型,然后才能做分析处理。合并多列转换为日期类型,可以直接用 `to_datetime`函数来处理: ```pytho

【pandas小技巧】--数据转置

所谓**数据转置**,就是是将原始数据表格沿着对角线翻折,使原来的行变成新的列,原来的列变成新的行,从而更方便地进行数据分析和处理。 `pandas`中`DataFrame`的转置非常简单,每个`DataFrame`对象都有一个`T`属性,通过这个属性就能得到转置之后的`DataFrame`。下面介

【pandas小技巧】--统计值作为新列

这次介绍的小技巧不是统计,而是把统计结果作为**新列**和原来的数据放在一起。`pandas`的各种统计功能之前已经介绍了不少,但是每次都是统计结果归统计结果,原始数据归原始数据,没有把它们合并在一个数据集中来观察。 下面通过两个场景示例来演示如果把统计值作为新列的数据。 # 1. 成绩统计的场景

【pandas小技巧】--category类型补充

`category`类型在**pandas基础**系列中有一篇介绍数据类型的文章中已经介绍过。`category`类型并不是`python`中的类型,是`pandas`特有的类型。 `category`类型的优势那篇文章已经介绍过,当时只是介绍了如何将某个列的数据转换成`category`类型,以及

【pandas小技巧】--DataFrame的显示参数

我们在`jupyter notebook`中使用`pandas`显示`DataFrame`的数据时,由于屏幕大小,或者数据量大小的原因,常常会觉得显示出来的表格不是特别符合预期。 这时,就需要调整`pandas`显示`DataFrame`的方式。`pandas`为我们提供了很多调整显示方式的参数,具

【pandas小技巧】--DataFrame的显示样式

上一篇介绍了`DataFrame`的显示参数,主要是对`DataFrame`中值进行调整。 本篇介绍`DataFrame`的显示样式的调整,显示样式主要是对表格本身的调整,比如颜色,通过颜色可以突出显示重要的值,观察数据时可以更加高效的获取主要信息。 下面介绍一些针对单个数据和批量数据的样式调整方式

【pandas小技巧】--花哨的DataFrame

最近github上发现了一个库(`plottable`),可以用简单的方式就设置出花哨的 `DataFrame` 样式。 github上的地址:[https://github.com/znstrider/plottable](https://github.com/znstrider/plottabl

【pandas小技巧】--目录(完结)

`pandas`小技巧系列是介绍的是使用`pandas`分析数据时,最常用的一些操作技巧。 具体包括: 1. [创建测试数据](https://www.cnblogs.com/wang_yb/p/17552748.html) 学习pandas的过程中,为了尝试pandas提供的各类功能强大的函数,常

【pandas小技巧】--创建测试数据

学习`pandas`的过程中,为了尝试`pandas`提供的各类功能强大的函数,常常需要花费很多时间去创造测试数据。 在`pandas`中,快速创建测试数据可以更快的评估 `pandas` 函数。通过生成一组测试数据,可以评估例如 `read_csv`、`read_excel`、`groupby`等