前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python进阶之Pandas入门(四) 数据清理

Python进阶之Pandas入门(四) 数据清理

作者头像
HuangWeiAI
发布2020-02-10 11:42:57
1.8K0
发布2020-02-10 11:42:57
举报
文章被收录于专栏:浊酒清味

引言

Pandas是数据分析中一个至关重要的库,它是大多数据项目的支柱。如果你想从事数据分析相关的职业,那么你要做的第一件事情就是学习Pandas。

通过这一课,您将会:

1、学会清理列索引;

2、学会处理缺失数据。

清理列索引

很多时候,数据集将具有包含符号、大小写单词、空格和拼写的冗长列名。为了使通过列名选择数据更容易,我们可以花一点时间来清理它们的名称。

我们依然使用上一节课的数据集:

代码语言:javascript
复制
import pandas as pd
movies_df = pd.read_csv("IMDB-Movie-Data.csv", index_col="Title")

下面是如何打印我们的数据集的列名:

代码语言:javascript
复制
print (movies_df.columns)

运行结果:

代码语言:javascript
复制
Index(['Rank', 'Genre', 'Description', 'Director', 'Actors', 'Year',
       'Runtime (Minutes)', 'Rating', 'Votes', 'Revenue (Millions)',
       'Metascore'],
      dtype='object')

如果您希望通过简单的复制和粘贴来重命名列,.columns不仅可以派上用场,而且如果您需要了解在按列选择数据时为什么会收到Key Error,它也很有用。

我们可以使用.rename()方法通过dict重命名某些列或所有列:

代码语言:javascript
复制
movies_df.rename(columns={
        'Runtime (Minutes)': 'Runtime', 
        'Revenue (Millions)': 'Revenue_millions'
    }, inplace=True)

print (movies_df.columns)

运行结果:

代码语言:javascript
复制
Index(['Rank', 'Genre', 'Description', 'Director', 'Actors', 'Year', 'Runtime',
       'Rating', 'Votes', 'Revenue_millions', 'Metascore'],
      dtype='object')

完美!

但是如果我们想要所有的名字都小写呢?除了使用.rename(),我们还可以像这样设置列的名称列表:

代码语言:javascript
复制
movies_df.columns = ['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime', 
                     'rating', 'votes', 'revenue_millions', 'metascore']

print (movies_df.columns)

运行结果:

代码语言:javascript
复制
Index(['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime',
       'rating', 'votes', 'revenue_millions', 'metascore'],
      dtype='object')

虽然结果很满意,但是这样工作量太大了。不只是手动重命名每一列,我们可以做一个列表操作:

代码语言:javascript
复制
movies_df.columns = [col.lower() for col in movies_df]

print (movies_df.columns)

运行结果:

代码语言:javascript
复制
Index(['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime',
       'rating', 'votes', 'revenue_millions', 'metascore'],
      dtype='object')

如果您要使用数据集一段时间,最好使用小写字母、删除特殊字符并使用下划线替换空格。

如何处理缺失的值

在研究数据时,您很可能会遇到缺失值或null值,它们实际上是不存在值的占位符。最常见的是Python的None或NumPy的np.nan,在某些情况下它们的处理方式是不同的。

处理空值有两种选择:

  • 去掉带有空值的行或列
  • 用非空值替换空值,这种技术称为imputation

让我们计算数据集的每一列的空值总数。第一步是检查我们的DataFrame中的哪些单元格是空的:

代码语言:javascript
复制
print (movies_df.isnull())

运行结果:

注意isnull()返回一个DataFrame,其中每个单元格是真还是假取决于该单元格的null状态。

为了计算每个列中的空值,我们使用一个聚合函数进行求和:

代码语言:javascript
复制
print (movies_df.isnull().sum())

运行结果:

代码语言:javascript
复制
rank                  0
genre                 0
description           0
director              0
actors                0
year                  0
runtime               0
rating                0
votes                 0
revenue_millions    128
metascore            64
dtype: int64

.isnull()本身不是很有用,通常与sum()等其他方法结合使用。

现在我们可以看到,我们的数据有128个revenue_millions缺失值和64个metascore缺失值。

1

删除空值

数据科学家和分析师经常面临删除或输入空值的难题,这是一个需要对数据及其上下文有深入了解的决策。总的来说,只建议在缺少少量数据的情况下删除空数据。

删除空值非常简单:

代码语言:javascript
复制
movies_df.dropna()

这个操作将删除至少有一个空值的任何行,但是它将返回一个新的DataFrame,而不改变原来的数据。您也可以在这个方法中指定inplace=True来改变原来的数据。

因此,对于我们的数据集,这个操作将

  • 删除128行,其中revenue_millions为空;
  • 删除64行,其中metascore为空。

这显然是一种浪费,因为在那些被删除的行的其他列中有非常好的数据。

除了删除行之外,您还可以通过设置axis=1来删除空值的列:

代码语言:javascript
复制
movies_df.dropna(axis=1)

在我们的数据集中,这个操作将删除revenue_millionsmetascore列。

2

imputation

归算(imputation)是一种传统的特征工程技术,用于保留具有null值的有价值数据。

可能会有这样的情况,删除每一行的空值会从数据集中删除太大的数据块,所以我们可以用另一个值来代替这个空值,通常是该列的平均值或中值。

让我们看看在revenue_millions列中输入缺失的值。首先,我们将该列提取到它自己的变量:

代码语言:javascript
复制
revenue = movies_df['revenue_millions']

这里使用方括号是我们在DataFrame中选择列的一般方法。

如果您还记得我们从零开始创建DataFrames时,dict的键最后是列名。现在,当我们选择DataFrame的列时,我们使用方括号,就像访问Python字典一样。收入现在包含一系列:

代码语言:javascript
复制
print (revenue.head())

运行结果:

代码语言:javascript
复制
Title
Guardians of the Galaxy333.13Prometheus126.46Split138.12Sing270.32SuicideSquad325.02Name: revenue_millions, dtype: float64

与DataFrame的格式略有不同,但是我们仍然有Title索引。

我们将用均值来计算收入的缺失值。这是平均值:

代码语言:javascript
复制
revenue_mean = revenue.mean()

print (revenue_mean)

运行结果:

代码语言:javascript
复制
82.95637614678897

有了均值,fillna()将会填充空值:

代码语言:javascript
复制
revenue.fillna(revenue_mean, inplace=True)

我们现在用列的平均值替换了所有的收益为空。注意,通过使用inplace=True,我们实际上影响了原始的movies_df

代码语言:javascript
复制
print (movies_df.isnull().sum())

运行结果:

代码语言:javascript
复制
rank                 0
genre                0
description          0
director             0
actors               0
year                 0
runtime              0
rating               0
votes                0
revenue_millions     0
metascore           64
dtype: int64

像这样输入具有相同值的整个列是一个基本示例。

温馨提示

欢迎分享和转发~

参考:

Python Pandas Tutorial: A Complete Introduction for Beginners https://www.learndatasci.com/tutorials/python-pandas-tutorial-complete-introduction-for-beginners/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与机器学习之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档