展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Python数据清洗技巧:pandas预处理全攻略

Python数据清洗技巧:pandas预处理全攻略

缺失值处理:识别缺失值常用df.isnull().sum()或df.isna().any(),填充可用固定值、均值、中位数、前后向填充等方法,若缺失比例小或无保留价值可直接删除;2.重复值处理:使用df.duplicated()识别重复行,df.drop_duplicates()删除重复记录,默认保留首次出现;3.数据类型转换:用astype()进行类型转换,pd.to_datetime()和pd.to_numeric()分别用于日期和数值型字符串转换;4.字符串/文本数据清洗:通过str.lower()

缺失值处理:识别缺失值常用df.isnull().sum()或df.isna().any(),填充可用固定值、均值、中位数、前后向填充等方法,若缺失比例小或无保留价值可直接删除;2. 重复值处理:使用df.duplicated()识别重复行,df.drop_duplicates()删除重复记录,默认保留首次出现;3. 数据类型转换:用astype()进行类型转换,pd.to_datetime()和pd.to_numeric()分别用于日期和数值型字符串转换;4. 字符串/文本数据清洗:通过str.lower()、str.strip()、str.replace()等方法统一大小写、去除空格、替换字符;5. 异常值处理:识别可用Z-score或IQR法,结合箱线图等可视化工具,处理方式包括删除、替换、转换或不处理,具体取决于业务背景和模型需求。

Python怎样进行数据清洗?pandas预处理技巧

Python进行数据清洗,核心利器无疑是pandas库。它提供了一整套高效的数据结构和功能,帮助我们处理数据中常见的缺失、重复、格式不一、异常等问题,说白了,就是把那些“脏兮兮”的数据变得干净、规整,能真正为后续分析所用。

Python怎样进行数据清洗?pandas预处理技巧

解决方案

要说Python里怎么搞定数据清洗,pandas绝对是绕不开的话题。它提供了DataFrame这种表格型数据结构,操作起来跟Excel或者数据库表的感觉有点像,但效率和灵活性高得多。我通常会从以下几个方面入手:

Python怎样进行数据清洗?pandas预处理技巧

1. 缺失值处理: 这是最常见的痛点。数据总会有“空洞”。

  • 识别: df.isnull().sum()能很快告诉你每列有多少缺失值,或者df.isna().any()看看有没有缺失。
  • 填充:
    • 用某个固定值填充:df['column'].fillna(0, inplace=True)
    • 用均值、中位数填充:df['column'].fillna(df['column'].mean(), inplace=True)。这种方法挺常用,但得看数据分布,偏态分布时中位数可能更好。
    • 前向/后向填充:df['column'].fillna(method='ffill', inplace=True)method='bfill'。这个在时间序列数据里特别好用,能保持数据的连续性。
  • 删除: 如果缺失值占比很小,或者某些行/列的缺失值太多以至于没有保留价值,直接删除是简单粗暴但有效的方法。
    • 删除含有任何缺失值的行:df.dropna(inplace=True)
    • 删除含有所有缺失值的列:df.dropna(axis=1, how='all', inplace=True)
import pandas as pd
import numpy as np

# 示例数据
data = {'A': [1, 2, np.nan, 4, 5],
        'B': [np.nan, 2, 3, 4, np.nan],
        'C': ['apple', 'banana', 'orange', np.nan, 'grape']}
df = pd.DataFrame(data)

print("原始数据:\n", df)

# 检查缺失值
print("\n缺失值统计:\n", df.isnull().sum())

# 填充缺失值 (以列'A'为例,用中位数填充)
df['A'].fillna(df['A'].median(), inplace=True)

# 填充缺失值 (以列'B'为例,前向填充)
df['B'].fillna(method='ffill', inplace=True)

# 删除列'C'中的缺失值行
df.dropna(subset=['C'], inplace=True)

print("\n处理缺失值后的数据:\n", df)

2. 重复值处理: 数据录入或合并时,很容易出现重复记录。

Python怎样进行数据清洗?pandas预处理技巧
  • 识别: df.duplicated()会返回一个布尔序列,指示哪些行是重复的。
  • 删除: df.drop_duplicates(inplace=True)可以删除所有重复行,默认保留第一次出现的。如果想保留最后一次出现的,可以设置keep='last'
data_dup = {'ID': [1, 2, 2, 3, 4, 4],
            'Value': ['A', 'B', 'B', 'C', 'D', 'D']}
df_dup = pd.DataFrame(data_dup)
print("\n原始重复数据:\n", df_dup)

print("\n重复行识别:\n", df_dup.duplicated())

df_dup.drop_duplicates(inplace=True)
print("\n删除重复行后的数据:\n", df_dup)

3. 数据类型转换: 数据导入后,有时列的数据类型不是我们想要的,比如数字被识别成了字符串。

  • df['column'].astype(int)df['column'].astype(float)
  • 日期时间字符串转日期时间对象:pd.to_datetime(df['date_column'])
  • 数值型字符串转数值:pd.to_numeric(df['num_column'], errors='coerce')errors='coerce'很重要,它可以把无法转换的值变成NaN,避免程序崩溃。
df_type = pd.DataFrame({'num_str': ['10', '20', '30a', '40'],
                        'date_str': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04']})
print("\n原始数据类型:\n", df_type.dtypes)

df_type['num_str'] = pd.to_numeric(df_type['num_str'], errors='coerce')
df_type['date_str'] = pd.to_datetime(df_type['date_str'])

print("\n转换数据类型后的数据:\n", df_type.dtypes)
print("转换后的数据:\n", df_type)

4. 字符串/文本数据清洗: 文本数据往往最“脏”,大小写不一、多余空格、特殊字符等等。

  • df['text_column'].str.lower() / .upper() 统一大小写
  • df['text_column'].str.strip() 去除首尾空格
  • df['text_column'].str.replace('old', 'new') 替换特定字符串
  • df['text_column'].str.contains('keyword') 检查是否包含某个关键词
  • 正则表达式匹配:df['text_column'].str.extract(r'(\d+)')
df_text = pd.DataFrame({'product': [' Apple ', 'banana_ ', 'Orange!', 'Grape']})
print("\n原始文本数据:\n", df_text)

df_text['product'] = df_text['product'].str.strip().str.lower().str.replace('!', '')
print("\n清洗后的文本数据:\n", df_text)

5. 异常值处理: 这块比较复杂,异常值不一定都是“错”的,有时它们本身就很有意义。

  • 识别:
    • 统计方法: Z-score(如果数据近似正态分布),IQR(四分位距)法。
    • 可视化: 箱线图(df.boxplot())能直观显示异常点,散点图也能帮助发现。
  • 处理:
    • 删除: 最简单,但可能丢失有用信息。
    • 替换: 用均值、中位数或上下限值替换。
    • 不处理: 如果异常值有业务意义,或者模型对异常值不敏感(比如决策树),有时就保留它。
# IQR 方法识别异常值
Q1 = df['A'].quantile(0.25)
Q3 = df['A'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 假设我们在'A'列引入一个异常值
df.loc[0, 'A'] = 100 # 故意制造一个异常值
print("\n含异常值的数据:\n", df)

outliers = df[(df['A'] < lower_bound) | (df['A'] > upper_bound)]
print("\n识别到的异常值:\n", outliers)

# 处理异常值 (这里简单地用中位数替换)
# df.loc[(df['A'] < lower_bound) | (df['A'] > upper_bound), 'A'] = df['A'].median()
# print("\n处理异常值后的数据:\n", df)

为什么数据清洗是数据分析的关键一步?

说实话,很多人在拿到数据的时候,第一反应可能就是赶紧跑模型、出结果。但往往忽略了最基础也是最重要的一步——数据清洗。在我看来,数据清洗不仅仅是一个技术操作,它更像是一场侦探游戏,你得仔细审视每一个数据点,理解它的来龙去脉。

如果数据是脏的,比如有大量的缺失值、错误的数据类型、重复的记录,甚至是明显的异常值,那么你后续做的任何分析、构建的任何模型,都可能像建立在沙滩上的城堡,经不起推敲。用一句老话讲就是“Garbage In, Garbage Out”(垃圾进,垃圾出)。你喂给模型垃圾数据,它自然也只能吐出垃圾结果。

数据清洗能确保我们分析的可靠性。想象一下,你用包含了重复用户的数据去计算用户活跃度,结果肯定会虚高;或者用包含了错误编码的商品数据去分析销售趋势,那得到的结论多半是误导性的。清洗过程本身也是一个深入理解数据的过程,你会发现数据中隐藏的问题,甚至能从中发现一些有趣的模式或潜在的业务漏洞。所以,它不是可有可无的“体力活”,而是提升数据价值的基石。

处理缺失值时,选择填充还是删除?

这是一个经典问题,没有一劳永逸的答案,更多的是一种权衡和取舍。我个人在做决策时,通常会考虑几个关键点:

删除缺失值:

  • 优点: 简单直接,能保证数据的完整性,避免引入人为偏差。
  • 缺点:
    • 信息丢失: 如果缺失值很多,删除会导致大量数据丢失,减少样本量,可能影响统计分析的效力。
    • 引入偏差: 如果缺失不是随机的(比如高收入人群更倾向于不填某个敏感信息),那么删除这些行可能会导致剩余数据无法代表整体,从而引入选择性偏差。
  • 适用场景: 当缺失值占比非常小(比如低于5%),且缺失是完全随机的(MCAR),或者该行/列的缺失值多到几乎没有用处时。

填充缺失值(Imputation):

  • 优点: 保留了更多的样本数据,避免了信息丢失。
  • 缺点:
    • 引入偏差: 填充值是估计出来的,不是真实值,可能会降低数据的真实性,甚至扭曲变量间的关系。
    • 增加复杂性: 需要选择合适的填充方法,不同的方法可能带来不同的影响。
  • 常见填充方法及考量:
    • 均值/中位数/众数填充: 简单易行,但会降低数据的方差,且不适用于非数值型数据。中位数对异常值更鲁棒。
    • 前向/后向填充: 在时间序列或有序数据中非常有用,假设缺失值与前后值相关。
    • 模型预测填充: 比如用K-NN、回归模型等预测缺失值。这种方法更复杂,但理论上更准确,因为它考虑了变量间的关系。不过,这本身也引入了模型误差。
  • 适用场景: 当缺失值占比较大,或者我们认为缺失值可以通过其他已知信息合理推断时。

最终的选择,往往是根据缺失值在数据集中的分布、缺失的模式(是随机缺失、条件缺失还是非随机缺失)、数据的业务含义以及后续分析或模型的具体需求来决定的。有时候,甚至可以尝试多种方法,然后通过交叉验证或模型表现来评估哪种处理方式更优。没有银弹,只有最适合当前场景的方案。

如何有效地识别和处理异常值?

识别和处理异常值,这事儿比缺失值和重复值更让人头疼,因为“异常”这个词本身就带着主观色彩。一个值是异常,可能是数据录入错误,也可能是真实世界里一个非常罕见的事件。所以,在动手之前,我总会先问自己:这个“异常”到底意味着什么?

识别异常值的方法:

  1. 统计方法:

    • Z-score(Z分数): 如果数据大致服从正态分布,Z-score能衡量一个数据点偏离均值的标准差倍数。通常,Z-score绝对值大于2或3的点会被认为是异常值。
      from scipy.stats import zscore
      df['zscore_A'] = np.abs(zscore(df['A'].dropna())) # 对非缺失值计算
      # 找出 Z-score 超过阈值的行
      # outliers_z = df[df['zscore_A'] > 3]
    • IQR(四分位距)法: 这是我个人更常用且觉得更稳健的方法,因为它不受极端值影响。它定义了数据中间50%的范围。
      • 计算第一四分位数(Q1)和第三四分位数(Q3)。
      • IQR = Q3 - Q1。
      • 异常值通常定义为小于Q1 - 1.5 * IQR或大于Q3 + 1.5 * IQR的值。
        Q1 = df['A'].quantile(0.25)
        Q3 = df['A'].quantile(0.75)
        IQR = Q3 - Q1
        lower_bound = Q1 - 1.5 * IQR
        upper_bound = Q3 + 1.5 * IQR
        # outliers_iqr = df[(df['A'] < lower_bound) | (df['A'] > upper_bound)]
  2. 可视化方法:

    • 箱线图(Box Plot): df.boxplot() 简直是识别异常值的利器。它能直观地展示数据的分布、中位数、四分位数,以及超出“胡须”范围的离群点(通常就是IQR方法识别的异常值)。
    • 散点图(Scatter Plot): 对于两个变量的关系,散点图能帮助我们发现那些明显偏离整体趋势的点。
    • 直方图/密度图: 观察数据分布,如果某个区域的值非常稀疏或突然出现孤立的峰值,可能就是异常。
  3. 业务知识: 这才是最最关键的。一个统计上看起来“异常”的值,在业务逻辑上可能完全合理。比如,一个电商平台某天销售额突然暴涨,可能是因为“双十一”大促,而不是数据错误。脱离业务背景谈异常值处理,往往会犯大错。

处理异常值的方法:

  1. 删除:

    • 最简单粗暴,直接把含有异常值的行或列删掉。
    • 风险: 丢失信息,尤其当异常值本身带有重要信息时;如果异常值很多,可能导致样本量过小。
    • 适用: 确认是数据录入错误,且数量极少,对整体分析影响不大。
  2. 替换(Winsorization/Capping):

    • 用某个阈值(比如IQR的上下边界)替换异常值,或者用均值、中位数替换。
    • 优点: 保留了样本量,减少了极端值对统计量的影响。
    • 缺点: 可能会扭曲数据的原始分布,引入人为偏差。
    • 示例:
      # 将超出上限的异常值替换为上限值
      df.loc[df['A'] > upper_bound, 'A'] = upper_bound
      # 将低于下限的异常值替换为下限值
      df.loc[df['A'] < lower_bound, 'A'] = lower_bound
  3. 转换:

    • 对数转换、平方根转换等。这些转换可以使数据分布更接近正态,从而减少极端值的影响。
    • 适用: 当数据高度偏态时。
  4. 分箱/离散化:

    • 将连续的数值型变量划分到不同的区间,异常值自然会落入某个区间。
    • 适用: 如果异常值的具体数值不重要,而它所属的“极端”类别更重要。
  5. 不处理:

    • 有时异常值本身就是研究对象,比如欺诈检测、故障诊断。
    • 有些模型(如决策树、随机森林)对异常值不那么敏感,甚至能很好地利用它们。
    • 重要: 必须在充分理解数据和业务的基础上,才能做出不处理的决定。

处理异常值是一个迭代的过程,可能需要尝试多种方法,并结合业务专家的意见。重要的是要记住,处理异常值的目的不是为了让数据看起来“完美”,而是为了让数据更好地服务于我们的分析目标。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。