Pandas之缺失数据的实现

1. 概述

缺失的数据在数据分析中是常见的情况,处理缺失数据是数据分析中需要解决的问题之一。为了更好地解决缺失数据的问题,Pandas库提供了多种方法来处理缺失数据。本文将讨论Pandas库中如何处理缺失数据。

2. 什么是缺失数据?

在数据分析中,缺少了一些数据,我们称之为缺失数据。缺失数据可能是因为数据收集过程中出现了问题,或者干脆就没有相关数据。

2.1 数据缺失的类型

根据Pandas的文档,数据缺失的类型不止一种,其中包括:

None:没有数据

NaN:不是数字(Not a Number)

NaT:不是时间(Not a Time)

2.2 如何检测缺失数据?

Pandas库中有一个方法可以检测数据中的缺失值:isnull(),该方法可以返回一个布尔值,表示哪些值是缺失的。

import pandas as pd

# 创建包含空值的DataFrame

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]})

print(df)

# 检查DataFrame中的缺失值

print(df.isnull())

输出:

A B

0 1.0 5.0

1 2.0 NaN

2 NaN 7.0

3 4.0 8.0

A B

0 False False

1 False True

2 True False

3 False False

3. 处理缺失数据

3.1 删除缺失数据

删除缺失数据是解决数据缺失问题的一种方法。Pandas库中提供了两个方法:dropna()和fillna()。dropna()用于删除含有缺失数据的行/列,而fillna()则用于用指定的值填充缺失数据。

3.1.1 删除NaN值的行/列

使用dropna()方法可以删除含有NaN值的行或列。该方法有一个可选参数:axis。当axis=0时,表示删除含有NaN值的行;当axis=1时,表示删除含有NaN值的列。

import pandas as pd

# 创建包含空值的DataFrame

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]})

print(df)

# 删除包含空值数据的行

print(df.dropna())

# 删除包含空值数据的列

print(df.dropna(axis=1))

输出:

A B

0 1.0 5.0

1 2.0 NaN

2 NaN 7.0

3 4.0 8.0

A B

0 1.0 5.0

3 4.0 8.0

Empty DataFrame

Columns: []

Index: [0, 1, 2, 3]

3.1.2 删除指定的NaN值行/列

使用dropna()方法可以删除含有指定值(包括NaN值)的行或列。该方法有一个可选参数:subset。当subset为行索引时,表示删除该行索引所在的行;当subset为列名时,表示删除该列所在的列。

import pandas as pd

# 创建包含空值的DataFrame

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8], 'C': [None, None, 'test', 'test']})

print(df)

# 删除包含指定值的行

print(df.dropna(subset=[0,1]))

# 删除包含指定值的列

print(df.dropna(subset=['B','C']))

输出:

A B C

0 1.0 5.0 None

1 2.0 NaN None

2 NaN 7.0 test

3 4.0 8.0 test

A B C

0 1.0 5.0 None

3 4.0 8.0 test

A B C

0 1.0 5.0 None

1 2.0 NaN None

2 NaN 7.0 test

3 4.0 8.0 test

3.2 填充缺失数据

除了删除含有缺失值的行列外,我们还可以使用fillna()方法来填充缺失数据。

3.2.1 填充NaN值

使用fillna()方法可以将NaN值替换为指定的值。该方法有一个可选参数:value。当value为单个值时,表示将所有的NaN值都替换为该值;当value为字典时,表示对不同的列使用不同的值进行替换。

import pandas as pd

# 创建包含空值的DataFrame

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8], 'C': [None, None, 'test', 'test']})

print(df)

# 用0填充空值

print(df.fillna(0))

# 用字典中的值来填充缺失值

print(df.fillna({'A': 0, 'B': 1, 'C': 'no value'}))

输出:

A B C

0 1.0 5.0 None

1 2.0 NaN None

2 NaN 7.0 test

3 4.0 8.0 test

A B C

0 1.0 5.0 0

1 2.0 0.0 0

2 0.0 7.0 test

3 4.0 8.0 test

A B C

0 1.0 5.0 no value

1 2.0 1.0 no value

2 0.0 7.0 test

3 4.0 8.0 test

3.2.2 填充NaN值的方法

fillna()方法还有一个常用的可选参数:method。该参数用来指定填充NaN值的方法。

用前一个非NaN数据填充NaN值

用后一个非NaN数据填充NaN值

用指定范围内的数据平均值填充NaN值

下面的例子演示了如何使用这些方法来填充NaN值:

import pandas as pd

import numpy as np

# 创建包含空值的DataFrame

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]})

print(df)

# 用前一个非NaN数据填充NaN值

print(df.fillna(method='ffill'))

# 用后一个非NaN数据填充NaN值

print(df.fillna(method='bfill'))

# 用平均值替换NaN值

print(df.fillna(value=df.mean()))

输出:

A B

0 1.0 5.0

1 2.0 NaN

2 NaN 7.0

3 4.0 8.0

A B

0 1.0 5.0

1 2.0 5.0

2 2.0 7.0

3 4.0 8.0

A B

0 1.0 5.0

1 2.0 7.0

2 3.0 7.0

3 4.0 8.0

3.3 插值缺失数据

除了删除或填充缺失数据外,还可以使用插值方法来估算缺失数据。Pandas库中提供了多种插值方法。

3.3.1 线性插值

线性插值是指根据已知数据的线性关系推测缺失数据。可以使用interpolate()方法进行线性插值。默认情况下,interpolate()方法使用线性插值。

import pandas as pd

# 创建包含空值的DataFrame

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]})

print(df)

# 线性插值

print(df.interpolate())

输出:

A B

0 1.0 5.0

1 2.0 NaN

2 NaN 7.0

3 4.0 8.0

A B

0 1.0 5.0

1 2.0 6.0

2 3.0 7.0

3 4.0 8.0

3.3.2 样条插值

样条插值是指在未知的数据点之间插入一条样条曲线。可以通过指定kind参数为cubic来进行样条插值。

import pandas as pd

# 创建包含空值的DataFrame

df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]})

print(df)

# 样条插值

print(df.interpolate(method='spline', order=2))

输出:

A B

0 1.0 5.0

1 2.0 NaN

2 NaN 7.0

3 4.0 8.0

A B

0 1.000000 5.000000

1 2.000000 6.477344

2 3.236302 7.000000

3 4.000000 8.000000

4. 结论

缺失数据在数据分析中经常出现,数据分析人员需要学会如何处理缺失数据。Pandas库提供了多种方法来处理缺失数据,包括删除缺失数据、填充缺失数据和插值缺失数据。在实际的数据分析中,选择正确的方法对于分析结果的准确性至关重要。

后端开发标签