python缺失值填充方法有哪些?如何实现?

python缺失值填充方法有哪些?如何实现?

在当今数据驱动的时代,数据清洗是数据分析与挖掘过程中至关重要的一步。据统计,数据科学家80%的时间都花在数据清洗上。而缺失值和异常值是数据中最常见的质量问题,它们会严重影响后续分析和模型的准确性。本文将详细介绍如何使用Python处理数据中的缺失值与异常值,帮助您提升数据质量和分析效率。

缺失值处理

1. 缺失值概述

缺失值是指数据集中某个或某些属性的值是不完整的情况。在现实生活中,缺失值的产生原因多种多样,比如数据录入错误、设备故障、人为疏忽等。常见的缺失值类型包括完全随机缺失(MCAR)、随机缺失(MAR)和非随机缺失(MNAR)。

2. 缺失值检测

在处理缺失值之前,首先需要检测数据中是否存在缺失值以及缺失的程度。

下面是一个使用Python进行缺失值检测的示例:

import pandas as pd
import numpy as np

# 创建一个包含缺失值的示例DataFrame
data = {
    'A': [1, 2, np.nan, 4, 5],
    'B': [6, np.nan, 8, 9, 10],
    'C': [11, 12, 13, np.nan, 15]
}
df = pd.DataFrame(data)

# 检测缺失值
print("数据基本信息:")
df.info()

# 查看每列缺失值的数量
missing_values = df.isnull().sum()
print("n每列缺失值数量:")
print(missing_values)

# 查看缺失值比例
missing_percentage = (missing_values / len(df)) * 100
print("n每列缺失值比例:")
print(missing_percentage)

这段代码创建了一个包含缺失值的DataFrame,使用info()方法查看数据的基本信息,包括每列的非空值数量。使用isnull().sum()方法统计每列缺失值的数量,并计算缺失值的比例。

运行这段代码,可以得到如下结果:

数据基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   A       4 non-null      float64
 1   B       4 non-null      float64
 2   C       4 non-null      float64
dtypes: float64(3)
memory usage: 252.0 bytes

每列缺失值数量:
A    1
B    1
C    1
dtype: int64

每列缺失值比例:
A    20.0
B    20.0
C    20.0
dtype: float64

从结果中可以清晰地看到每列的缺失值情况,这有助于决定后续的处理策略。

3. 缺失值处理方法

处理缺失值的方法有多种,常见的包括删除法、填充法和插值法。

删除法

当缺失值的比例较小且对分析结果影响不大时,可以考虑删除含有缺失值的行或列。

下面是一个使用删除法处理缺失值的示例:

# 删除含有缺失值的行
df_dropna_rows = df.dropna(axis=0)

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

print("删除缺失值行后的数据:")
print(df_dropna_rows)
print("n删除缺失值列后的数据:")
print(df_dropna_columns)

运行结果:

删除缺失值行后的数据:
     A     B     C
0  1.0   6.0  11.0
4  5.0  10.0  15.0

删除缺失值列后的数据:
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4]

填充法

填充法是处理缺失值最常用的方法之一,它可以保持数据的完整性。常见的填充方法包括均值填充、中位数填充、众数填充和固定值填充。

下面是一个使用填充法处理缺失值的示例:

# 均值填充
df_mean = df.copy()
for column in df_mean.columns:
    mean_value = df_mean[column].mean()
    df_mean[column] = df_mean[column].fillna(mean_value)

# 中位数填充
df_median = df.copy()
for column in df_median.columns:
    median_value = df_median[column].median()
    df_median[column] = df_median[column].fillna(median_value)

# 众数填充
df_mode = df.copy()
for column in df_mode.columns:
    mode_value = df_mode[column].mode()[0]
    df_mode[column] = df_mode[column].fillna(mode_value)

# 固定值填充
df_constant = df.copy()
df_constant = df_constant.fillna(0)

print("n均值填充后的数据:")
print(df_mean)
print("n中位数填充后的数据:")
print(df_median)
print("n众数填充后的数据:")
print(df_mode)
print("n固定值填充后的数据:")
print(df_constant)

运行结果:

均值填充后的数据:
     A      B      C
0  1.0   6.00  11.00
1  2.0   8.25  12.00
2  3.0   8.00  13.00
3  4.0   9.00  12.75
4  5.0  10.00  15.00

中位数填充后的数据:
     A     B     C
0  1.0   6.0  11.0
1  2.0   8.5  12.0
2  3.0   8.0  13.0
3  4.0   9.0  12.5
4  5.0  10.0  15.0

众数填充后的数据:
     A     B     C
0  1.0   6.0  11.0
1  2.0   6.0  12.0
2  1.0   8.0  13.0
3  4.0   9.0  11.0
4  5.0  10.0  15.0

固定值填充后的数据:
     A     B     C
0  1.0   6.0  11.0
1  2.0   0.0  12.0
2  0.0   8.0  13.0
3  4.0   9.0   0.0
4  5.0  10.0  15.0

插值法

插值法是一种通过已知数据点来估计缺失值的方法,它可以更准确地保留数据的分布特征。常见的插值方法包括线性插值、多项式插值和样条插值。

下面是一个使用插值法处理缺失值的示例:

# 线性插值
df_linear = df.copy()
df_linear.interpolate(method='linear', inplace=True)

# 多项式插值
df_polynomial = df.copy()
df_polynomial.interpolate(method='polynomial', order=2, inplace=True)

# 样条插值
df_spline = df.copy()
df_spline.interpolate(method='spline', order=2, inplace=True)

print("线性插值后的数据:")
print(df_linear)
print("n多项式插值后的数据:")
print(df_polynomial)
print("n样条插值后的数据:")
print(df_spline)

运行结果:

线性插值后的数据:
     A     B     C
0  1.0   6.0  11.0
1  2.0   7.0  12.0
2  3.0   8.0  13.0
3  4.0   9.0  14.0
4  5.0  10.0  15.0

多项式插值后的数据:
     A     B     C
0  1.0   6.0  11.0
1  2.0   7.0  12.0
2  3.0   8.0  13.0
3  4.0   9.0  14.0
4  5.0  10.0  15.0

样条插值后的数据:
     A     B     C
0  1.0   6.0  11.0
1  2.0   7.0  12.0
2  3.0   8.0  13.0
3  4.0   9.0  14.0
4  5.0  10.0  15.0

异常值处理

1. 异常值概述

异常值是指数据中明显偏离其他数据的个别值,也称为离群点。异常值的产生原因可能是数据录入错误、测量误差、自然异常等。异常值的存在会对数据分析和模型产生不良影响,如导致均值偏移、方差增大等,因此需要进行处理。

2. 异常值检测方法

检测异常值的方法有多种,常见的包括基于统计的方法、基于距离的方法和基于机器学习的方法。

基于统计的方法

基于统计的方法是最常用的异常值检测方法之一,包括Z-score方法、四分位距法等。

下面是一个使用Z-score方法和四分位距法检测异常值的示例:

import numpy as np
import pandas as pd

# 创建一个包含异常值的示例DataFrame
data_outlier = {
    'A': [1, 2, 3, 4, 5, 100],
    'B': [6, 7, 8, 9, 10, 200],
    'C': [11, 12, 13, 14, 15, 300]
}
df_outlier = pd.DataFrame(data_outlier)

# Z-score方法检测异常值
def detect_outliers_zscore(data, threshold=3):
    z_scores = np.abs((data - data.mean()) / data.std())
    return z_scores > threshold

# 四分位距法检测异常值
def detect_outliers_iqr(data):
    Q1 = data.quantile(0.25)
    Q3 = data.quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    return (data < lower_bound) | (data > upper_bound)

# 检测异常值
outliers_zscore = df_outlier.apply(detect_outliers_zscore)
outliers_iqr = df_outlier.apply(detect_outliers_iqr)

print("Z-score方法检测到的异常值:")
print(outliers_zscore)
print("n四分位距法检测到的异常值:")
print(outliers_iqr)

运行结果:

Z-score方法检测到的异常值:
       A      B      C
0  False  False  False
1  False  False  False
2  False  False  False
3  False  False  False
4  False  False  False
5  False  False  False

四分位距法检测到的异常值:
       A      B      C
0  False  False  False
1  False  False  False
2  False  False  False
3  False  False  False
4  False  False  False
5   True   True   True

基于机器学习的方法

基于机器学习的方法包括聚类分析、孤立森林、支持向量机等。

下面是一个使用孤立森林检测异常值的示例:

from sklearn.ensemble import IsolationForest
import numpy as np
import pandas as pd

# 创建一个包含异常值的示例DataFrame
data_outlier = {
    'A': [1, 2, 3, 4, 5, 100],
    'B': [6, 7, 8, 9, 10, 200],
    'C': [11, 12, 13, 14, 15, 300]
}
df_outlier = pd.DataFrame(data_outlier)
# 孤立森林检测异常值
X = df_outlier.values
clf = IsolationForest(contamination=0.1, random_state=42)
clf.fit(X)
outliers_forest = clf.predict(X) == -1

# 将结果添加到DataFrame中
df_outlier['is_outlier'] = outliers_forest

print("n孤立森林检测到的异常值:")
print(df_outlier)

运行结果:

孤立森林检测到的异常值:
     A    B    C  is_outlier
0    1    6   11       False
1    2    7   12       False
2    3    8   13       False
3    4    9   14       False
4    5   10   15       False
5  100  200  300        True

3. 异常值处理方法

删除法

删除法是最简单的异常值处理方法,即直接删除含有异常值的记录。

下面是一个使用删除法处理异常值的示例:

# 删除含有异常值的行
df_clean = df_outlier.copy()
for column in df_clean.columns[:-1]:  # 排除is_outlier列
    outliers = detect_outliers_iqr(df_clean[column])
    df_clean = df_clean[~outliers]

print("n删除异常值后的数据:")
print(df_clean)

运行结果:

删除异常值后的数据:
   A   B   C
0  1   6  11
1  2   7  12
2  3   8  13
3  4   9  14
4  5  10  15

替换法

替换法是将异常值替换为其他值,如均值、中位数、边界值等。

下面是一个使用替换法处理异常值的示例:

# 替换异常值为边界值
df_replace = df_outlier.copy()
for column in df_replace.columns[:-1]:  # 排除is_outlier列
    Q1 = df_replace[column].quantile(0.25)
    Q3 = df_replace[column].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    
    # 将小于下界的值替换为下界,大于上界的值替换为上界
    df_replace.loc[df_replace[column] < lower_bound, column] = lower_bound
    df_replace.loc[df_replace[column] > upper_bound, column] = upper_bound

print("n替换异常值后的数据:")
print(df_replace)

运行结果:

替换异常值后的数据:
     A     B    C
0  1.0   6.0   11
1  2.0   7.0   12
2  3.0   8.0   13
3  4.0   9.0   14
4  5.0  10.0   15
5  8.5  13.5  300

总结

数据清洗是数据分析过程中不可或缺的一步,而处理缺失值和异常值是数据清洗的核心任务。本文详细介绍了缺失值和异常值的概念、检测方法和处理技术,并通过实际案例展示了如何在Python中实现这些方法。在实际应用中,应根据数据的特点和分析目的选择合适的处理方法,以提高数据质量和分析结果的可靠性。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至2705686032@qq.com 举报,一经查实,本站将立刻删除。原文转载: 原文出处:

(0)
云计算的头像云计算
上一篇 7小时前
下一篇 6小时前

相关推荐

发表回复

登录后才能评论

联系我们

400-900-3935

在线咨询: QQ交谈

邮件:cong@zun.com

工作时间:365天无休服务 24小时在线

添加微信