引言
Pandas是数据分析中一个至关重要的库,它是大多数据项目的支柱。如果你想从事数据分析相关的职业,那么你要做的第一件事情就是学习Pandas。
通过这一课,您将会:
1、学会清理列索引;
2、学会处理缺失数据。
清理列索引
很多时候,数据集将具有包含符号、大小写单词、空格和拼写的冗长列名。为了使通过列名选择数据更容易,我们可以花一点时间来清理它们的名称。
我们依然使用上一节课的数据集:
import pandas as pd
movies_df = pd.read_csv("IMDB-Movie-Data.csv", index_col="Title")
下面是如何打印我们的数据集的列名:
print (movies_df.columns)
运行结果:
Index(['Rank', 'Genre', 'Description', 'Director', 'Actors', 'Year',
'Runtime (Minutes)', 'Rating', 'Votes', 'Revenue (Millions)',
'Metascore'],
dtype='object')
如果您希望通过简单的复制和粘贴来重命名列,.columns
不仅可以派上用场,而且如果您需要了解在按列选择数据时为什么会收到Key Error
,它也很有用。
我们可以使用.rename()
方法通过dict
重命名某些列或所有列:
movies_df.rename(columns={
'Runtime (Minutes)': 'Runtime',
'Revenue (Millions)': 'Revenue_millions'
}, inplace=True)
print (movies_df.columns)
运行结果:
Index(['Rank', 'Genre', 'Description', 'Director', 'Actors', 'Year', 'Runtime',
'Rating', 'Votes', 'Revenue_millions', 'Metascore'],
dtype='object')
完美!
但是如果我们想要所有的名字都小写呢?除了使用.rename()
,我们还可以像这样设置列的名称列表:
movies_df.columns = ['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime',
'rating', 'votes', 'revenue_millions', 'metascore']
print (movies_df.columns)
运行结果:
Index(['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime',
'rating', 'votes', 'revenue_millions', 'metascore'],
dtype='object')
虽然结果很满意,但是这样工作量太大了。不只是手动重命名每一列,我们可以做一个列表操作:
movies_df.columns = [col.lower() for col in movies_df]
print (movies_df.columns)
运行结果:
Index(['rank', 'genre', 'description', 'director', 'actors', 'year', 'runtime',
'rating', 'votes', 'revenue_millions', 'metascore'],
dtype='object')
如果您要使用数据集一段时间,最好使用小写字母、删除特殊字符并使用下划线替换空格。
如何处理缺失的值
在研究数据时,您很可能会遇到缺失值或null值,它们实际上是不存在值的占位符。最常见的是Python的None
或NumPy的np.nan
,在某些情况下它们的处理方式是不同的。
处理空值有两种选择:
让我们计算数据集的每一列的空值总数。第一步是检查我们的DataFrame中的哪些单元格是空的:
print (movies_df.isnull())
运行结果:
注意isnull()
返回一个DataFrame,其中每个单元格是真还是假取决于该单元格的null状态。
为了计算每个列中的空值,我们使用一个聚合函数进行求和:
print (movies_df.isnull().sum())
运行结果:
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
删除空值
数据科学家和分析师经常面临删除或输入空值的难题,这是一个需要对数据及其上下文有深入了解的决策。总的来说,只建议在缺少少量数据的情况下删除空数据。
删除空值非常简单:
movies_df.dropna()
这个操作将删除至少有一个空值的任何行,但是它将返回一个新的DataFrame,而不改变原来的数据。您也可以在这个方法中指定inplace=True
来改变原来的数据。
因此,对于我们的数据集,这个操作将
revenue_millions
为空;metascore
为空。
这显然是一种浪费,因为在那些被删除的行的其他列中有非常好的数据。
除了删除行之外,您还可以通过设置axis=1
来删除空值的列:
movies_df.dropna(axis=1)
在我们的数据集中,这个操作将删除revenue_millions
和metascore
列。
2
imputation
归算(imputation)是一种传统的特征工程技术,用于保留具有null值的有价值数据。
可能会有这样的情况,删除每一行的空值会从数据集中删除太大的数据块,所以我们可以用另一个值来代替这个空值,通常是该列的平均值或中值。
让我们看看在revenue_millions
列中输入缺失的值。首先,我们将该列提取到它自己的变量:
revenue = movies_df['revenue_millions']
这里使用方括号是我们在DataFrame中选择列的一般方法。
如果您还记得我们从零开始创建DataFrames时,dict
的键最后是列名。现在,当我们选择DataFrame的列时,我们使用方括号,就像访问Python字典一样。收入现在包含一系列:
print (revenue.head())
运行结果:
Title
Guardians of the Galaxy333.13Prometheus126.46Split138.12Sing270.32SuicideSquad325.02Name: revenue_millions, dtype: float64
与DataFrame的格式略有不同,但是我们仍然有Title
索引。
我们将用均值来计算收入的缺失值。这是平均值:
revenue_mean = revenue.mean()
print (revenue_mean)
运行结果:
82.95637614678897
有了均值,fillna()
将会填充空值:
revenue.fillna(revenue_mean, inplace=True)
我们现在用列的平均值替换了所有的收益为空。注意,通过使用inplace=True
,我们实际上影响了原始的movies_df
:
print (movies_df.isnull().sum())
运行结果:
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/
本文分享自 Python与机器学习之路 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!