当前位置:首页 > 编程语言 > 正文内容

数据清洗的10个Pandas单行代码技巧

a8116255310个月前 (04-17)编程语言11

清理数据并不复杂。掌握用于数据清理的 Python 单行程序可以大大加快工作流程,并保持代码的整洁。本博客将重点介绍用于数据清理的最有用的 Python 单行代码,帮助您在一行代码中处理缺失值、重复数据、格式化问题等。我们将探讨适合初学者和专家的 Pandas 数据清理单行示例。您还将发现基本的 Python 数据清理库,让预处理变得高效而直观。准备好以更智能而非更困难的方式清理数据了吗?让我们深入了解紧凑而强大的单行代码!

数据清理为何重要?

在深入了解数据清理流程之前,了解数据清理为何是准确分析和机器学习的关键至关重要。原始数据集通常比较混乱,其中的缺失值、重复数据和不一致的格式可能会扭曲结果。正确的数据清理可确保为分析奠定可靠的基础,提高算法性能和洞察力。

我们将探讨的单行代码能以最少的代码解决常见的数据问题,使数据预处理更快、更高效。现在,让我们来看看清理数据集的步骤,轻松地将数据集转换为干净、分析就绪的形式。

数据清理的单行解决方案

1. 使用dropna()处理缺失数据

现实世界中的数据集很少是完美无缺的。你会面临的最常见问题之一就是缺失值,无论是由于数据收集、数据 *** 并中的错误,还是手动输入造成的。幸运的是,Pandas 提供了一个简单而强大的 *** 来处理这个问题:dropna()

但是 dropna() 可以使用多个参数。让我们来探索如何充分利用它。

  1. axis

指定删除行还是列:

  • axis=0: 丢弃行(默认值)
  • axis=1: 删除列

代码

df.dropna(axis=0)  # Drops rows
df.dropna(axis=1)  # Drops columns
  1. how

定义要删除的条件:

  • how=’any’: 如果缺少任何值,则删除(默认)
  • how=’all’: 仅当所有值都缺失时才丢弃

代码:

df.dropna(how='any')   # Drop if at least one NaN
df.dropna(how='all')   # Drop only if all values are NaN
  1. thresh

指定保留行/列所需的最小非 NAN 值个数。

代码

df.dropna(thresh=3)  # Keep rows with at least 3 non-NaN values

注意:不能同时使用 how 和 thresh。

  1. subset

仅将条件应用于特定列(或行,如果轴=1)。

代码:

df.dropna(subset=['col1', 'col2'])  # Drop rows if NaN in col1 or col2#import csv

2. 使用fillna()处理缺失数据

您可以使用 Pandas 的 fillna() *** 填补缺失数据,而不是丢弃缺失数据。当你想估算值而不是丢失数据时,这个 *** 尤其有用。

让我们来探讨一下如何使用不同参数的 fillna() *** 。

  1. subset

指定一个标量、字典、数列或计算值(如平均值、中位数或模式)来填补缺失数据。

代码:

df.fillna(0)  # Fill all NaNs with 0
df.fillna({'col1': 0, 'col2': 99})  # Fill col1 with 0, col2 with 99
# Fill with mean, median, or mode of a column
df['col1'].fillna(df['col1'].mean(), inplace=True)
df['col2'].fillna(df['col2'].median(), inplace=True)
df['col3'].fillna(df['col3'].mode()[0], inplace=True)  # Mode returns a Series
  1. method

用于向前或向后传播非空值:

  • ‘ffill’ 或 ‘pad’: 正向填充
  • ‘bfill’ 或 ‘backfill’:向后填充

代码:

df.fillna(method='ffill')  # Fill forward
df.fillna(method='bfill')  # Fill backward
  1. axis

选择填充方向:

  • axis=0:向下填充(行方向,默认值)
  • axis=1:横向填充(列向填充)

代码:

df.fillna(method='ffill', axis=0)  # Fill down
df.fillna(method='bfill', axis=1)  # Fill across
  1. limit

前向/后向填充中最多可填充的 NaN 个数。

代码:

df.fillna(method='ffill', limit=1)  # Fill at most 1 NaN in a row/column#import csv

3. 使用drop_duplicates()删除重复值

使用 drop_duplicates() 函数轻松删除数据集中的重复行,只需一行代码就能确保数据的干净和唯一性。

让我们探讨如何使用不同的参数来使用 drop_dupliucates

  1. subset

指定查找重复数据的特定列。

  • 默认值: 检查所有列
  • 使用单列或列列表

代码

df.drop_duplicates(subset='col1')         # Check duplicates only in 'col1'
df.drop_duplicates(subset=['col1', 'col2'])  # Check based on multiple columns
  1. keep

决定保留哪个副本:

  • ‘first’ (default): 保留之一次出现的副本
  • ‘last’:保留最后一次重复
  • False:删除所有重复

代码:

df.drop_duplicates(keep='first')  # Keep first duplicate
df.drop_duplicates(keep='last')   # Keep last duplicate
df.drop_duplicates(keep=False)    # Drop all duplicates

4. 使用replace()替换特定值

您可以使用 replace() 替换 DataFrameSeries 中的特定值。

代码:

# Replace a single value
df.replace(0, np.nan)
# Replace multiple values
df.replace([0, -1], np.nan)
# Replace with dictionary
df.replace({'A': {'old': 'new'}, 'B': {1: 100}})
# Replace in-place
df.replace('missing', np.nan, inplace=True)#import csv

5. 使用astype()更改数据类型

更改列的数据类型有助于确保正确操作和内存效率。

代码:

df['Age'] = df['Age'].astype(int)         # Convert to integer
df['Price'] = df['Price'].astype(float)   # Convert to float
df['Date'] = pd.to_datetime(df['Date'])   # Convert to datetime

6. 使用str.strip()删除字符串中的空格

在数据集中,字符串值中不需要的前导空格或尾部空格会导致排序、比较或分组问题。str.strip() *** 可以有效地删除这些空格。

代码

df['col'].str.lstrip()   # Removes leading spaces
df['col'].str.rstrip()   # Removes trailing spaces
df['col'].str.strip()    # Removes both leading & trailing

7.清理和提取列值

通过删除不需要的字符或使用正则表达式提取特定模式,可以清理列值。

代码:

 # Remove punctuation
df['col'] = df['col'].str.replace(r'[^\w\s]', '', regex=True) 
# Extract the username part before '@' in an email address
df['email_user'] = df['email'].str.extract(r'(^[^@]+)')
# Extract the 4-digit year from a date string
df['year'] = df['date'].str.extract(r'(\d{4})')
# Extract the first hashtag from a tweet
df['hashtag'] = df['tweet'].str.extract(r'#(\w+)')
# Extract phone numbers in the format 123-456-7890
df['phone'] = df['contact'].str.extract(r'(\d{3}-\d{3}-\d{4})')

8. 映射和替换值

您可以映射或替换列中的特定值,以规范或转换数据。

代码

df['Gender'] = df['Gender'].map({'M': 'Male', 'F': 'Female'})
df['Rating'] = df['Rating'].map({1: 'Bad', 2: 'Okay', 3: 'Good'})

9.处理异常值

异常值会扭曲统计分析和模型性能。以下是处理异常值的常用 *** :

  1. Z-score 法

代码:

# Keep only numeric columns, remove rows where any z-score > 3
df = df[(np.abs(stats.zscore(df.select_dtypes(include=[np.number]))) < 3).all(axis=1)]
  1. 剪切异常值(封顶至一定范围)

代码:

df['col'].clip(lower=df['col'].quantile(0.05),upper=df['col'].quantile(0.95))

10. 使用Lambda应用函数

Lambda 函数与 apply() 配合使用,可快速转换或操作列中的数据。lambda 函数起转换作用,而 apply() 则将其应用于整个列。

代码

df['col'] = df['col'].apply(lambda x: x.strip().lower())   # Removes extra spaces and converts text to lowercase

问题陈述

现在,您已经了解了这些 Python 单行代码,让我们来看看问题陈述并尝试解决它。您从一个在线零售平台获得了一个客户数据集。数据存在以下问题

  • 电子邮件、年龄、推特和 *** 等列中存在缺失值。
  • 重复条目(如相同的姓名和电子邮件)。
  • 格式不一致(如姓名中的空白、字符串中的“missing”)。
  • 数据类型问题(例如,Join_Date 值无效)。
  • Age 和 Purchase_Amount 中的异常值。
  • 需要使用 regex 清理和提取的文本数据(例如,从 Tweet 中提取标签,从电子邮件中提取用户名)。

您的任务是演示如何清理该数据集。

解决方案

有关完整的解决方案,请参阅此。它将引导您完成使用 Python 和 pandas 有效清理数据集所需的每个步骤。

按照以下说明清理数据集

  1. 删除所有值缺失的行
df.dropna(how='all', inplace=True)
  1. 将 ‘missing’ 或 ‘not available’ 等占位符文本标准化为 NaN
df.replace(['missing', 'not available', 'NaN'], np.nan, inplace=True)
  1. 填补缺失值
df['Age'] = df['Age'].fillna(df['Age'].median())
df['Email'] = df['Email'].fillna('unknown@example.com')
df['Gender'] = df['Gender'].fillna(df['Gender'].mode()[0])
df['Purchase_Amount'] = df['Purchase_Amount'].fillna(df['Purchase_Amount'].median())
df['Join_Date'] = df['Join_Date'].fillna(method='ffill')
df['Tweet'] = df['Tweet'].fillna('No tweet')
df['Phone'] = df['Phone'].fillna('000-000-0000')
  1. 删除重复内容
df.drop_duplicates(inplace=True)
  1. 删除空格,规范文本字段
df['Name'] = df['Name'].apply(lambda x: x.strip().lower() if isinstance(x, str) else x)
df['Feedback'] = df['Feedback'].str.replace(r'[^\w\s]', '', regex=True)
  1. 转换数据类型
df['Age'] = df['Age'].astype(int)
df['Purchase_Amount'] = df['Purchase_Amount'].astype(float)
df['Join_Date'] = pd.to_datetime(df['Join_Date'], errors='coerce')
  1. 修复无效值
df = df[df['Age'].between(10, 100)]  # realistic age
df = df[df['Purchase_Amount'] > 0]   # remove negative or zero purchases
  1. 利用 Z 值去除离群值
numeric_cols = df[['Age', 'Purchase_Amount']]
z_scores = np.abs(stats.zscore(numeric_cols))
df = df[(z_scores < 3).all(axis=1)]
  1. Regex 提取
df['Email_Username'] = df['Email'].str.extract(r'^([^@]+)')
df['Join_Year'] = df['Join_Date'].astype(str).str.extract(r'(\d{4})')
df['Formatted_Phone'] = df['Phone'].str.extract(r'(\d{3}-\d{3}-\d{4})')
  1. ‘Name’ 的最后清理
df['Name'] = df['Name'].apply(lambda x: x if isinstance(x, str) else 'unknown')

清理前的数据集

清理后的数据集

小结

清理数据是任何数据分析或机器学习项目的关键步骤。通过掌握这些功能强大的 Python 数据清理单行程序,您可以简化数据预处理工作流程,确保数据准确、一致,并为分析做好准备。从处理缺失值和重复值到删除异常值和格式化问题,这些单行代码让您无需编写冗长的代码就能高效地清理数据。利用 Pandas 和正则表达式的强大功能,您可以保持代码干净、简洁并易于维护。无论您是初学者还是专家,这些 *** 都能帮助您更智能、更快速地清理数据。

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://2345hao.cn/blog/index.php/post/8293.html

分享给朋友:

“数据清洗的10个Pandas单行代码技巧” 的相关文章

宝塔面板教程之安装及常见问题篇

宝塔面板教程之安装及常见问题篇

宝塔面板现在已经成为国内许多站长必备的服务器管理必备工具。相比直接使用SSH+FTP来管理服务器,宝塔面板可以提供可视化管理,包括文件管理、数据库管理、数据备份、SSL配置等等。 如果你希望更简单高效地管理您的网站及服务器,宝塔面板是不错的选择。下面是一些宝塔面板安装及常见问题:...

静态与动态IP地址有何区别?

静态与动态IP地址有何区别?

每台连接到Internet的计算机都有一个Internet协议 (IP) 地址。但是,并非所有IP地址的外观或行为都相同。 如果您使用计算机网络或服务器,了解动态IP和静态IP之间的区别至关重要。通过详细了解每个协议,您可以选择最适合您需求的解决方案。 在本文中,我们将讨论静态和动态IP之间...

宝塔面板教程之面板设置篇

宝塔面板教程之面板设置篇

宝塔面板设置主要涉及的是宝塔控制后台自身的参数,包括诸如面板的开关、自动更新及SSL、面板端口设置等。虽然这部分不涉及服务器自身的管理,但对宝塔面板的设置也有其重要。 特别是面板端口、安全入口及面板密码等涉及安全的参数设置。 启动和关闭面板 如果你长时间无需使用到宝塔面板,可以考虑...

20个最佳Laravel免费和付费教程资源

20个最佳Laravel免费和付费教程资源

Laravel多年来一直是PHP应用程序开发的摇滚明星,这是有充分理由的。庞大的生态系统、活跃的社区、强大的就业市场、成功的初创公司——它拥有一切让采用新技术变得值得的东西。 如果你想学习Laravel,你不需要更进一步。通过浏览本指南,您可以找到最适合您的Laravel教程,与您的知识水平和...

2022年Web开发人员的平均工资统计报告

2022年Web开发人员的平均工资统计报告

想成为一名网络开发人员或好奇工作的哪些子类型的薪水最高?Web开发是一个竞争激烈、多样化的行业,随着新语言和框架的出现而不断发展。 询问Web开发人员的薪水是一个难以解决的问题(尽管我们尝试)。有太多的因素需要考虑。 无论您是自由开发者还是有兴趣从事更传统的工作、喜欢前端或后端工作,或者想知...

如何成为一名出色的Java开发人员

如何成为一名出色的Java开发人员

美国劳工统计局估计在美有超过软件开发人员。根据2021年的数据,其中,这是世界上使用最广泛的五种编程语言之一。 自然,学习Java并成为Java开发人员对于任何对软件开发感兴趣的人来说都是明智的职业选择。 在本综合指南中,您将学习成为Java开发人员所需的一切知识。我们将分解您需要的技能、工...