Advertisement

Pandas 清洗数据

阅读量:

概要

  • 【前期准备

作为 Python 中最受欢迎的库之一,Pandas 提供了强大的数据分析和处理功能。该库允许用户执行数据分析和处理任务,并与多种其他数据分析工具集成使用,例如 SciPy、NumPy 和 Matplotlib 等工具组合在一起应用。通过构建完整的分析工作流,数据科学家能够有效解决实际问题。

尽管我们能够利用Python和数据分析技术实现许多强大的功能,但分析结果的质量始终受制于原始数据的质量。常见的问题包括缺失的数据、格式混乱的数据(畸形),以及存在错误的数据情况。无论出现何种形式的问题报告或是不当的技术处理手段都会不可避免地导致出现"噪声"严重的' dirty data'

感到庆幸的是,在探索数据分析工具时 ,我了解到 Pandas提供了功能强大的类库集合 ,不论数据呈现何种状态 ,它能够帮助我们从杂乱中提炼出有价值的信息 。具体而言 ,我们可以利用这些工具完成以下操作 :首先进行数据清洗 ,接着进行排序处理 ,最终输出整洁有序的数据信息 。为了便于实践操作 ,我准备从该CSV文件中提取电影元数据(链接如下 :https://pan.baidu.com/s/1UfWB-vsBObiog3ZCiNJHmg ) 。该文件包含了丰富的元数据信息 :包括演员阵容 、导演团队 、预算投入等关键指标 。实际上还可以扩展至拥有上千万条甚至更大的数据库资源 。对于刚开始学习数据分析的人来说 ,这个案例数据集是一个非常合适的入门材料

遗憾的是,在数据集中存在一些列其数值缺失。此外,某些列采用0作为默认值。值得注意的是还有一些表示为NaN

下面我们通过使用 Pandas 提供的功能来清洗“脏”数据

准备工作

首先, 第一次使用 Pandas 之前,我们需要安装 Pandas。安装命令如下:

复制代码
    pip install pandas
    
    代码解读

接下来, 导入 Pandas 到我们的代码中,代码如下:

复制代码
 #可以使用其他的别名, 但是,pd 是官方推荐的别名,也是大家习惯的别名

    
 import pandas as pd
    
    
    
    
    代码解读

最后, 加载数据集,代码如下:

复制代码
    data = pd.read_csv('../data/tmdb_5000_credits.csv')
    
    代码解读

请务必确保已下载好所需的数据集。如果您的代码及所使用的数据存储路径与我设置的一致,则可以直接运行。

请务必确保已下载好所需的数据集。如果您的代码及所使用的数据存储路径与我设置的一致,则可以直接运行。

否则,要根据实际的情况,修改 read_csv() 的文件路径

检查数据

以便更好地了解我们刚导入的数据的基本结构,请问Pandas 实现了 head() 方法用于呈现前五行数据吗?这有助于我们掌握导入数据的整体认识。

data.head()

我们可以利用上面提到的Pandas工具来查看数据;除此之外,我们还可以使用常规的Excel程序来查看数据。这个时候可以开始记录数据上的问题,并寻找解决的方法。

Pandas 提供了一系列可供选择的方法, 这些方法能够实现对数据进行切分. 让我们简要介绍一下:

  • 获取一列的基础描述性统计指标:使用 data[column_name].describe()。
  • 提取单个字段的数据值表单:使用 data[['column_name']]。
  • 获取单个字段的头n行数据值表单:使用 data['columns_name'].head(n)。
  • 提取多个字段的数据值表单:使用 data[['col1', 'col2', 'col3']]。
  • 根据条件筛选结果表单:" where clause" 的应用方法为 data[condition].

处理缺失数据

缺失数据是最常见的问题之一。产生这个问题可能的原因

  • 从来没有填正确过
  • 数据不可用
  • 计算错误

由于任何原因,只要有缺失值存在,必然导致后续的数据分析出现错误。下面介绍几种处理缺失数据的方法:

  • 为缺失数据赋值默认值
  • 去掉/删除缺失数据行
  • 去掉/删除缺失率高的列

添加默认值

我们应当剔除那些不友好的 NaN 值。然而,在替换这些缺失值时,我们需要考虑使用什么合适的替代值?对于我们的例子分析而言,在‘country’列中我们可以观察到一些缺失的数据。对于我们的例子而言,在‘country’列中我们可以观察到一些缺失的数据。这一列相对简单,并且由于某些电影并未提供地理信息而导致某些记录对应的地理信息字段为空或标记为 NaN。因此这些记录对应的地理信息字段为空或标记为 NaN。由于在我们当前的例子中地理位置并不构成关键指标因此可以考虑将这些缺失的地理信息字段设为空字符串或者标记为 NaN

复制代码
    data.country= data.country.fillna('')
    
    代码解读

在上文中,我们采用了将整个'country'列替代为空字符串的方法。或者,在处理过程中,“None Given”作为替代选项之一也得到了应用,并且这种方法相对容易实现。此外,在处理过程中,“None Given”作为替代选项之一也得到了应用,并且这种方法相对容易实现。

采用数值型数据进行分析是一个常见的做法。例如,在考虑电影时长这一指标时, 我们可以通过计算平均电影长度来帮助我们对整个数据集进行评估。然而该持续时间系基于其他指标推算而来, 这种处理方法下, 就不会因遇到0值或NaN值而造成分析错误。

复制代码
    data.duration = data.duration.fillna(data.duration.mean())
    
    代码解读

删除不完整的行

为了便于后续处理和数据完整性维护,在面对含有缺失值的数据记录时

删除任何包含 NA 值的行是很容的:

复制代码
    data.dropna()
    
    代码解读

当然,我们也可以删除一整行的值都为 NA:

复制代码
    data.dropna(how='all')
    
    代码解读

我们也可以设置一定的约束条件,在行数据中可保留的非空值的数量是多少(例如,在下面的例子中)

复制代码
    data.drop(thresh=5)
    
    代码解读

比如说,我们不想要不知道电影上映时间的数据:

复制代码
    data.dropna(subset=['title_year'])
    
    代码解读

上面的 subset 参数支持我们选择关注的重点。当涉及多列时,请注意可以用包含各列名称的形式来表示参数设置。

删除不完整的列

我们可以将上述操作应用于列字段。在代码实现中,我们只需指定 axis=1 就能完成操作。这表示我们的操作仅作用于列数据而非行数据。同样地,在之前的行处理案例中,默认设置也是 axis=0。

删除一正列为 NA 的列:

复制代码
    data.drop(axis=1, how='all')
    
    代码解读

删除任何包含空值的列:

复制代码
    data.drop(axis=1. how='any')
    
    代码解读

在类似的情况下,我们还可以采用相同的阈值(threshold)和子集(subset),以获取更详细的说明和实例。为了进一步了解这一过程,请参考pandas.DataFrame.dropna

规范化数据类型

有时候,在处理包含一串数字的CSV文件时,“有时候会将数值型的数据误识别为字符串类型的数据”,或者会将原本为字符串形式的数值转换为数值型数据。“Pandas 还是提供了帮助我们统一和规范数据格式的功能:

复制代码
    data = pd.read_csv('../data/moive_metadata.csv', dtype={'duration': int})
    
    代码解读

这表明我们将Pandas的'duration'列指定为数值数据类型。类似地,如果我们希望将上映年视为字符串而非数值数据类型,则采用类似的方法。

复制代码
    data = pd.read_csv('./data/moive_metadata.csv', dtype={'title_year':str})
    
    代码解读

注意:为确保数据完整性,在重新从存储介质中读取 CSV 文件的同时,请以规范化的数据类型处理,并在读取前已预先保存中间结果

必要的变换

人工录入的数据可能都需要进行一些必要的变换。

  • 错别字
  • 英文单词时大小写的不统一
  • 输入了额外的空格

将我们数据中所有的 movie_title 改成大写:

复制代码
    data['movie_title'].str.upper()
    
    代码解读

同样的,干掉末尾空格:

复制代码
    data['movie_title'].str.strip()
    
    代码解读

此处并未详细探讨英文书写错误的具体处理方法,并建议采用模糊匹配算法进行优化处理

重命名列名

最终的数据可能经由计算机生成,并非真实数据来源;同样地, 列名也可能由计算机依照特定计算规则产生。这些自动生成的列名称对于系统运行并无阻碍, 但对于人工阅读者而言却不够直观易懂, 此时我们便需要将其重新命名为更加符合人类理解习惯的名字

复制代码
    data,rename(columns = {‘title_year’:’release_date’, ‘movie_facebook_likes’:’facebook_likes’})
    
    代码解读

按照前面所述, 我们成功地实现了两个列的重命名。
需要注意的是, 这个方法并没有提供 inpalce 参数, 我们都需要将结果赋值给自己即可:

复制代码
    data = data.rename(columns = {‘title_year’:’release_date’, ‘movie_facebook_likes’:’facebook_likes’})
    
    代码解读

保存结果

我们通常在数据清洗完成后会将结果存储为 CSV 格式,并便于后续程序进行处理。此外,在 Pandas 中提供了非常易于使用的功能。

复制代码
    data.to_csv(‘cleanfile.csv’ encoding=’utf-8’)
    
    代码解读

全部评论 (0)

还没有任何评论哟~