ModelCube实验 | 使用Pandas对美国橄榄球联盟 (NFL) 数据进行数据清洗

文摘   2024-07-31 07:05   浙江  

ModelCube(modelcube.cn)是博雅数智自主研发的一站式人工智能科研平台。为全国高校和科研机构的大数据和人工智能科研团队提供一站式科研服务。基于MLOps的实践和企业核心技术,实现了科研场景中全类型数据管理与标注,实验环境快速获取与灵活定制,模型的全生命周期管理,科研成果的管理与发布,以及 AI驱动的论文检索和学习等功能。

使用Pandas进行数据清洗

数据清理是数据科学的一个关键部分。为什么你处理的某些文本字段会出现乱码?你应该如何处理那些缺失数据?为什么你的日期格式不正确?如何快速清理不一致的数据输入?在实验程中大家您将了解为什么会遇到这些问题,更重要的是,了解如何解决这些问题!

在实验程中大家将学习如何解决一些最常见的数清洗理问题,以便更快地实际分析数据,大家将使用真实的数据完成动手练习,并回答一些最常见的数据清洗问题。

1. 观察数据

我们需要做的第一件事是加载我们将要使用的库和数据集。为了演示,我们将使用美式足球比赛中发生的事件的数据集。

# modules we'll use
import pandas as pd
import numpy as np

import warnings
warnings.filterwarnings("ignore")

nfl_data = pd.read_csv("../dataset/26664/NFL Play by Play 2009-2017 (v4).csv")
np.random.seed(0) 

当你得到一个新的数据集时,首先要做的就是查看其中的一些数据集。这可以让你看到所有数据集都能正确读取,并了解数据的情况。在这种情况下,让我们看看是否有任何丢失的值,这些值将用"NaN"或"None"表示。

nfl_data.head()

是的,看起来有一些缺失的值。

2. 我们有多少缺失的数据点?

好的,现在我们知道我们确实有一些缺失的值。让我们看看每列中有多少。

missing_values_count = nfl_data.isnull().sum()

missing_values_count[0:10]

缺失值似乎很多!了解我们数据集中缺失的值的百分比可能会有所帮助,以更好地了解这个问题的规模:

# 数据中一共有多少缺失值?
total_cells = np.product(nfl_data.shape)
total_missing = missing_values_count.sum()
# 缺失值比例
percent_missing = (total_missing/total_cells) * 100
print(percent_missing)

27.66722370547874

这个数据集中几乎有四分之一的单元格是空的!在下一步中,我们将仔细查看一些缺少值的列,并试图弄清楚它们可能发生了什么。

3. 找出数据丢失的原因

这就是我们进入数据科学的一部分,我喜欢称之为"数据直觉",我的意思是"真正查看你的数据,并试图弄清楚为什么会是这样,以及这将如何影响你的分析"。这可能是数据科学中令人沮丧的一部分,尤其是如果你是该领域的新手,并且没有太多经验。对于处理缺失的值,您需要使用直觉来找出该值缺失的原因。为了解决这个问题,你可以问自己最重要的问题之一是:

这个值丢失是因为它没有被记录还是因为它不存在

如果一个值因为不存在而丢失(比如没有孩子的人最大孩子的身高),那么尝试猜测它可能是什么是没有意义的。这些值你可能确实想保留为"NaN"。另一方面,如果一个值因为没有记录而丢失,那么您可以尝试根据该列和行中的其他值来猜测它可能是什么。这被称为插补,我们接下来将学习如何进行插补!)

让我们学习一个例子。查看nfl_data数据帧中缺失值的数量,我注意到"TimesSec"列中有很多缺失值:

missing_values_count[0:10]

通过查看文档,我可以看到这一栏有关于比赛进行时比赛剩余秒数的信息。这意味着这些值的丢失可能是因为它们没有被记录,而不是因为它们不存在。因此,我们应该试着猜测它们应该是什么,而不是把它们当作NA。

另一方面,还有其他领域,比如"PenalizedTeam",也有很多缺失的领域。然而,在这种情况下,场地是缺失的,因为如果没有点球,那么说哪支球队被罚是没有意义的。对于这一列,将其留空或添加第三个值(如"none")并使用它来替换NA更有意义。

提示:如果你还没有读过数据集文档,这是一个很好的地方!如果你正在使用从另一个人那里获得的数据集,你也可以尝试联系他们以获取更多信息。

如果你正在进行非常仔细的数据分析,这就是你应该单独查看每一列以找出填补这些缺失值的最佳策略的时候。对于本实验的其余部分,我们将介绍一些"快速"的技术,这些技术可以帮助您解决缺失的值,但也可能最终删除一些有用的信息或给您的数据添加一些噪音。

4. 删除缺失的值

如果你很匆忙,或者没有理由弄清楚为什么你的值缺失,你可以选择删除任何包含缺失值的行或列。(注意:我通常不建议在重要项目中使用这种方法!花时间浏览数据并逐一查看所有缺少值的列,以真正了解数据集通常是值得的。)

如果您确定要删除缺少值的行,pandas确实有一个方便的函数"dropna()"可以帮助您做到这一点。让我们在我们的NFL数据集上试试吧!

nfl_data.dropna()

看起来这已经删除了我们所有的数据! 这是因为数据集中的每一行都至少缺少一个值。我们可能会更幸运地删除所有至少有一个缺失值的column

columns_with_na_dropped = nfl_data.dropna(axis=1)
columns_with_na_dropped.head()
print("Columns in original dataset: %d \n" % nfl_data.shape[1])
print("Columns with na's dropped: %d" % columns_with_na_dropped.shape[1])

我们已经丢失了相当多的数据,但在这一点上,我们已经成功地从数据中删除了所有的"NaN"。

5. 自动填写缺失值

另一种选择是尝试填充缺失的值。接下来,我将获得NFL数据的一小部分,以便打印。


subset_nfl_data = nfl_data.loc[:, 'EPA':'Season'].head()
subset_nfl_data

我们可以使用Panda的"fillna()"函数来为我们填充数据帧中缺失的值。我们有一个选项是指定我们希望用什么来替换"NaN"值。在这里,我想用0替换所有的"NaN"值。


subset_nfl_data.fillna(0)

我也可以更灵活一点,用同一列中直接在它后面的任何值来替换缺失的值。(对于观测结果具有某种逻辑顺序的数据集来说,这很有意义)

subset_nfl_data.fillna(method='bfill', axis=0).fillna(0)


在线运行本实验请登录ModelCube

http://modelcube.cn/experiment/experiment-detail/1009585

数据科学人工智能
聚焦数据科学,大数据,人工智能,区块链和云计算等话题。技术资料分享,院士名家观点分享,前沿资讯分享。
 最新文章