Skip to content

Latest commit

 

History

History
485 lines (288 loc) · 15.9 KB

introduction-pandas-data-science.md

File metadata and controls

485 lines (288 loc) · 15.9 KB

数据科学的 Pandas 介绍

原文:www.kdnuggets.com/2020/06/introduction-pandas-data-science.html

数据科学的 Pandas 介绍

由 benzoix 提供的图像 来自 Freepik

Pandas 实际上是什么?为什么它如此著名?把 Pandas 想象成一个 Excel 表,但它比 Excel 更高级,具有更多的功能和灵活性。


我们的三大课程推荐

1. Google 网络安全证书 - 快速进入网络安全职业。

2. Google 数据分析专业证书 - 提升你的数据分析能力

3. Google IT 支持专业证书 - 支持你的组织 IT


为什么选择 Pandas

选择 pandas 的原因有很多,其中一些包括

  • 开源

  • 容易学习

  • 优秀的社区

  • 基于 Numpy 之上

  • 容易分析和预处理数据

  • 内置数据可视化

  • 许多内置函数帮助进行探索性数据分析

  • 内置支持 CSV、SQL、HTML、JSON、pickle、excel、剪贴板等

  • 还有很多其他功能

安装 Pandas

如果你使用 Anaconda,你将自动拥有 pandas,但如果由于某种原因没有它,只需运行以下命令

conda install pandas

如果你没有使用 Anaconda,通过 pip 安装

pip install pandas

导入

要导入 pandas,请使用

import pandas as pd
import numpy as np

最好与 pandas 一起导入 numpy,以便访问更多 numpy 功能,这有助于我们进行探索性数据分析(EDA)。

Pandas 数据结构

Pandas 有两个主要的数据结构。

  • Series

  • 数据框

Series

将 Series 视为 Excel 表中的一列。你也可以将其视为一个一维的 Numpy 数组。唯一的不同之处在于,我们可以为其设置索引名称。

创建 pandas Series 的基本语法如下:

newSeries = pd.Series(data , index)

数据可以是从 Python 字典到列表或元组的任何类型。它也可以是一个 numpy 数组。

让我们从 Python 列表中创建一个 Series:

mylist = ['Ahmad','Machine Learning', 20, 'Pakistan']
labels = ['Name', 'Career', 'Age', 'Country']
newSeries = pd.Series(mylist,labels)
print(newSeries)

newSeries 的输出。

在 pandas Series 中添加索引不是必须的。在这种情况下,它会自动从 0 开始索引。

mylist = ['Ahmad','Machine Learning', 20, 'Pakistan']
newSeries = pd.Series(mylist)
print(newSeries)

在这里,我们可以看到索引从 0 开始,一直到 Series 结束。现在让我们看看如何使用 Python 字典 创建 Series,

myDict = {'Name': 'Ahmad',
         'Career': 'Machine Learning',
         'Age': 20,
          'Country': 'Pakistan'}
mySeries = pd.Series(myDict)
print(mySeries)

在这里我们可以看到,我们不需要显式地传递索引值,因为它们会从字典的键中自动分配。

访问 Series 中的数据

访问 Pandas Series 中的数据的常见模式是:

seriesName['IndexName']

让我们以之前创建的 mySeries 为例。要获取 Name、Age 和 Career 的值,我们只需:

print(mySeries['Name'])
print(mySeries['Age'])
print(mySeries['Career'])

Pandas Series 的基本操作

让我们创建两个新系列来对它们进行操作。

newSeries = pd.Series([10,20,30,40],index=['LONDON','NEWYORK','Washington','Manchester'])
newSeries1 = pd.Series([10,20,35,46],index=['LONDON','NEWYORK','Istanbul','Karachi'])
print(newSeries,newSeries1,sep='\n\n')

基本的算术操作包括+-*/操作。这些操作是针对索引的,因此我们来执行它们。

newSeries + newSeries1

在这里我们可以看到,由于伦敦和 NEWYORK 索引在两个 Series 中都存在,因此它将两个值相加,其他的输出为 NaN(不是一个数字)。

newSeries * newSeries1

newSeries / newSeries1

元素级操作/广播

如果你对 Numpy 很熟悉,你一定听说过广播的概念。如果你不熟悉广播的概念,请参考 this link

现在,使用我们的 newSeries Series,我们将看到使用广播概念进行的操作。

newSeries + 5

在这里,它给 Series newSeries 中的每个元素加上了 5。这也被称为逐元素操作。类似地,其他操作如*、/、-、及其他运算符也是如此。我们只会看到运算符,你也应该尝试其他运算符。

newSeries ** 1/2

在这里,我们对每个数字进行逐元素的平方根计算。记住,平方根是任何数字的 1/2 次方。

Pandas 数据框

数据框确实是 Pandas 中最常用和最重要的数据结构。可以将数据框看作是一个 Excel 表格。

创建数据框的主要方法有:

  • 读取 CSV/Excel 文件

  • Python 字典

  • ndarray

让我们举个例子,看看如何使用字典创建数据框。

我们可以通过传递一个字典来创建数据框,其中字典的每个值都是一个列表。

df1 = {"Name":["Ahmad","Ali",'Ismail',"John"],"Age":  [20,21,19,17],"Height":[5.1,5.6,6.1,5.7]} 

要将这个字典转换为数据框,我们只需对这个字典调用 dataframe 函数即可。

df1 = pd.DataFrame(df1)
df1

df1

从列中获取值

要从列中获取值,我们可以使用这种语法:

#df1['columnname']
#df1.columnname

这两种语法都是正确的,但我们需要小心选择。如果我们的列名中有空格,那么肯定不能使用第二种方法。我们必须使用第一种方法。只有当列名中没有空格时,我们才可以使用第二种方法。

df1.Name

df1.Name

在这里我们可以看到列的值、它们的索引号、列名和列的数据类型。

df1['Age']

df1[‘Age’]

我们可以看到,使用这两种语法都会返回数据框的列,我们可以对其进行分析。

多列的值

要获取数据框中多个列的值,可以将列名作为列表传递。

df1[["Name","Age"]]

df1[[“Name”,”Age”]]

我们可以看到它返回了包含 Name 和 Age 两列的数据框。

Pandas 中 DataFrame 的重要函数

让我们通过使用一个名为‘Titanic’的数据集来深入探讨 DataFrame 的重要函数。这个数据集通常可以在线获得,或者你可以在 Kaggle 找到它。

读取数据

Pandas 对读取各种类型的数据提供了良好的内置支持,包括 CSV、fether、excel、HTML、JSON、pickle、SAS、SQL 等。

读取数据的常用语法是

# pd.read_fileExtensionName("File Path")

CSV

要从 CSV 文件中读取数据,你只需使用 pandas 的 read_csv 函数。

df = pd.read_csv('Path_To_CSVFile')

由于 Titanic 数据集也以 CSV 格式提供,所以我们将使用 read_csv 函数读取它。当你下载数据集时,你会得到两个名为 train.csv 和 test.csv 的文件,这些文件将帮助测试机器学习模型,所以我们将只关注 train_csv 文件。

df = pd.read_csv('train.csv')

现在 df 自动成为一个数据框。让我们探索它的一些函数。

head()

如果你正常打印你的数据集,它会显示一个完整的数据集,可能有百万行或列,这很难查看和分析。df.head() 函数允许我们查看数据集的前 ’n’ 行(默认 5 行),以便我们可以对数据集做一个粗略估计,并确定接下来要应用的关键函数。

df.head()

df.head()

现在我们可以看到数据集中的列及其前 5 行的值。由于我们没有传递任何值,因此它显示的是前 5 行。

tail()

类似于 head 函数,我们还有一个 tail 函数,它显示最后 n 个值。

df.tail(3)

df.tail(3)

我们可以看到数据集的最后 3 行,因为我们传递了 df.tail(3)。

shape()

shape() 是另一个重要的函数,用于分析数据集的形状,这在我们制作机器学习模型时非常有用,并且我们希望我们的维度是精确的。

df.shape()

df.shape()

在这里我们可以看到我们的输出是 (891,12),这等于 891 行和 12 列,这意味着我们总共有 12 个特征或 12 列和 891 行或 891 个样本。

之前我们使用 df.tail() 函数时,最后一列的索引号是 890,因为我们的索引是从 0 开始的,而不是从 1 开始的。如果索引号是从 1 开始的,那么最后一列的索引号将是 891。

isnull()

这是另一个重要的函数,用于查找数据集中为空的值。我们可以在之前的输出中看到一些值是 NaN,这意味着“不是数字”,我们必须处理这些缺失值以获得良好的结果。isnull() 是处理这些空值的重要函数。

df.isnull().head()

我正在使用 head 函数,以便我们可以看到前 5 个示例,而不是整个数据集。

df.isnull().head()

在这里,我们可以看到“Cabin”列中的一些值为 True。True 表示该值为 NaN 或缺失。我们可以看到这不容易理解,因此我们可以使用 sum()函数来获取更详细的信息。

sum()

sum 函数用于计算数据框中所有值的总和。记住 True 表示 1,False 表示 0,因此为了获取 isnull()函数返回的所有 True 值,我们可以使用 sum()函数。让我们检查一下。

df.isnull().sum()

df.isnull().sum()

在这里,我们可以看到只有“Age”、“Cabin”和“Embarked”列中有缺失值。

info()

info 函数也是一个常用的 pandas 函数,它“打印 DataFrame 的简洁摘要。”

df.info()

df.info()

在这里,我们可以看到它告诉我们有多少个非空实体,例如在年龄字段中,我们有 714 个非空的 float64 类型实体。它还告诉我们内存使用情况,在这个例子中是 83.6 KB。

describe()

describe()也是一个非常有用的函数来分析数据。它告诉我们数据框的描述统计信息,包括那些总结数据集分布的中心趋势、离散程度和形状的统计信息,排除值。

df.describe()

df.describe()

在这里,我们可以看到每一列的一些重要统计分析,包括均值、标准差、最小值等。更多信息请参见其文档

布尔索引

这也是 Numpy 和 Pandas 中一个重要且广泛使用的概念。

正如名称所示,我们使用布尔变量进行索引,即 True 和 False。如果索引为 True,则显示该行;如果索引为 False,则不显示该行。

当我们尝试从数据集中提取重要特征时,它对我们很有帮助。让我们以“Sex”为“male”的条目为例,看看我们如何解决这个问题。

df["Sex"]=="male"

这将返回一个布尔值为 True 和 False 的 Series,其中 True 表示“Sex”为“male”的行,否则为 False。

为了只查看前 10 个结果,我可以使用 head 函数,如下所示。

(df["Sex"]=="male").head(10)

(df[“sex”]==”male”).head(10)

现在,为了查看完整的数据框,只包含“Sex”为“male”的行,我们应该在数据框中传递 df[“Sex”]==”male”以获取所有“Sex”为“male”的结果。

df[df["Sex"]=="male"].head(5)

在这里,我们可以看到所有的结果都是“Sex”为 Male 的行。

现在让我们通过布尔索引提取一些有用的信息。

为了基于多个条件获取行,我们使用括号“()”和“&,|,!=”符号来连接多个条件。

让我们找出所有幸存男性乘客的百分比。

df[(df["Sex"]=="male") & (df["Survived"]==1)]

给这段代码一点时间,理解发生了什么。我们正在收集所有行,其中 df[“Sex”] == “male”并且 df[“Survived”]==1. 返回值是一个包含所有幸存男性乘客的 dataframe。

让我们找出幸存的男性乘客的百分比。

现在,幸存男性乘客的百分比公式是:幸存男性总数 / 男性乘客总数

在 pandas 中,我们可以这样写

men = df[df['Sex']=='male']['Survived']
perc = sum(men) / len(men) * 100

让我们逐步解析这段代码。

df[‘Sex’]==’male’将返回一个布尔 Series,其中性别为男性。

df[df[“Sex”]==”male”]将返回所有“Sex”为“male”的示例的完整数据框。

men = df[df[‘Sex’]==’male’][‘Survived’]将返回所有男性乘客的“Survived”列。

sum(men)将计算所有幸存男性的总和。由于这是一个由 0 和 1 组成的 Series,len(men)将返回男性的总数。

现在将这些放入上面的公式中,我们将找到在 Titanic 上幸存的所有男性的百分比。

18%!!!!! 是的,我们的数据集中只有 18%的男性幸存者。

类似地,我们可以为女性编写代码,我不这样做,但这是你的任务,我们发现 74%的女性乘客幸存于这次灾难。

这篇文章到此结束。显然,Pandas 中还有许多其他重要功能,如 groupby、apply、iloc、rename、replace 等。我建议你查看 Wes 编写的《Python 数据分析》书籍,他是这个 Pandas 库的创始人。

另外,查看一下这个备忘单以便快速参考。

Ahmad 对机器学习、深度学习和计算机视觉感兴趣。目前担任 Redbuffer 的初级机器学习工程师。

相关阅读