Pandas 中文手册

9.5 缺失值处理实战案例

Pandas缺失值处理实战案例 - 中文学习手册

Pandas 中文手册

本章节详细介绍了Pandas中缺失值处理的三个实战案例,包括不同缺失比例列的策略、按分组填充销量缺失值和插值法处理时间序列数据,帮助初学者掌握数据清洗技巧。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

缺失值处理实战案例

引言

在处理数据时,缺失值是常见的问题之一。正确处理缺失值对于确保数据质量和分析结果的准确性至关重要。Pandas提供了多种方法来处理缺失值,本章将通过三个实战案例来展示如何有效处理缺失值,适合新人学习。

案例1:不同缺失比例的列,采用不同处理策略

当数据集中的不同列有不同程度的缺失时,我们可以根据缺失比例选择不同的处理策略。例如,缺失率低的列可以用均值填充,缺失率高的列可以考虑删除或用其他方法填充。

步骤:

  1. 计算每列的缺失比例。
  2. 根据比例制定策略:
    • 如果缺失比例小于5%,可以用均值或中位数填充。
    • 如果缺失比例在5%到20%之间,可以使用更复杂的填充方法,如插值。
    • 如果缺失比例超过20%,可以考虑删除该列,或者使用机器学习模型预测。

代码示例:

import pandas as pd
import numpy as np

# 创建一个示例DataFrame
data = {
    'A': [1, 2, np.nan, 4, 5],
    'B': [np.nan, 2, 3, np.nan, np.nan],
    'C': [1, 2, 3, 4, 5]
}
df = pd.DataFrame(data)

# 计算缺失比例
missing_ratio = df.isnull().sum() / len(df) * 100
print("缺失比例:")
print(missing_ratio)

# 根据比例处理
for col in df.columns:
    if missing_ratio[col] < 5:
        df[col].fillna(df[col].mean(), inplace=True)
    elif missing_ratio[col] < 20:
        df[col].fillna(df[col].median(), inplace=True)
    else:
        df.drop(columns=[col], inplace=True)  # 如果缺失比例高,删除列

print("\n处理后的DataFrame:")
print(df)

案例2:按分组填充缺失值

在某些情况下,缺失值的填充应该基于数据的分组。例如,按地区分组后,用该地区的平均值填充销量缺失值。

步骤:

  1. 使用groupby方法将数据分组。
  2. 对每组应用填充方法,如填充均值。

代码示例:

import pandas as pd
import numpy as np

# 创建一个示例DataFrame
data = {
    '地区': ['北京', '北京', '上海', '上海', '广州', '广州'],
    '销量': [100, np.nan, 150, np.nan, 200, 250],
    '月份': [1, 2, 1, 2, 1, 2]
}
df = pd.DataFrame(data)

print("原始DataFrame:")
print(df)

# 按地区分组,并用每组的均值填充缺失值
df['销量'] = df.groupby('地区')['销量'].transform(lambda x: x.fillna(x.mean()))

print("\n按分组填充后的DataFrame:")
print(df)

案例3:插值法填充时间序列数据中的缺失值

对于时间序列数据,缺失值可以通过插值法填充,如线性插值,以保持数据的连续性。

步骤:

  1. 确保数据按时间排序。
  2. 使用Pandas的interpolate方法进行插值。

代码示例:

import pandas as pd
import numpy as np

# 创建一个时间序列示例DataFrame
dates = pd.date_range('2023-01-01', periods=5, freq='D')
data = {
    '日期': dates,
    '值': [10, np.nan, 30, np.nan, 50]
}
df = pd.DataFrame(data)
df.set_index('日期', inplace=True)  # 设置日期为索引

print("原始时间序列数据:")
print(df)

# 使用线性插值填充缺失值
df['值'] = df['值'].interpolate(method='linear')

print("\n插值后的时间序列数据:")
print(df)

总结

通过本章的三个案例,我们学习了如何根据不同情况处理Pandas中的缺失值:根据缺失比例选择策略、按分组填充以及使用插值法处理时间序列。这些方法可以帮助我们有效清洗数据,为后续分析打下基础。在实际应用中,应根据数据的特点和需求选择合适的方法。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包