什么是 Pandas

这整个系列教程将使用机器学习中最常用的编程语言 —— Python。Python 的社群特别强大,里面有无数个有用的且效率高的模组可以用来进行数据处理。包括今天的主角:Pandas

Pandas 是 Python 中用来读取和操作数据的一个库,它可以将数据转换成人们看得懂的表格模式来将数据进行输出,同时它也可以以数值方式对数据进行解释,从而使用户可以对数据进行各种计算。

我们将 Pandas 的数据表称为 DataFrame

读取数据

现在开始使用 pandas 来读取数据,我们习惯将其命名为 pd,一遍后续能够快速调用

import pandas as pd

由于在 《训练与测试篇》 中,我们介绍了 训练集测试集 的概念,所以我现在从那边穿越回来,告知读者,我们提供的数据是从 kaggle 下载的已经分离过的 train.csv。如需下载原先 sololearn 提供的数据集,请 点此下载

我们将对泰坦尼克号的数据集进行处理,在 train.csv 数据集中,记录了所有泰坦尼克号乘客的信息,包括以下几种(字段很多,就没一一列举了):

  • 幸存情况
  • 舱位等级
  • 姓名、性别、年龄……等
PassengerId Survived Pclass Lname Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
1 0 3 Braund Mr. Owen Harris male 22 1 0 A/5 21171 7.25 S
2 1 1 Cumings Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 PC 17599 71.2833 C85 C
3 1 3 Heikkinen Miss. Laina female 26 0 0 STON/O2. 3101282 7.925 S
4 1 1 Futrelle Mrs. Jacques Heath (Lily May Peel) female 35 1 0 113803 53.1 C123 S
5 0 3 Allen Mr. William Henry male 35 0 0 373450 8.05 S

我们将使用 pandas 对数据进行读取,可以通过 pandas 的 read_csv API 对数据进行读取,并转换成 pandas DataFrame 对象:

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

由于 Titanic Dataset 经常作为机器学习的学习用途,所以将其分为训练集和测试集两种,上方链接下载的就是训练集 train.csv,所以读取的是 train.csv 而非 titanic.csv。

df 现在保存了 titanic 数据集的 DataFrame,接下来可以使用 DataFrame.head() 函数对数据集的首五行进行输出:

print(df.head())

将数据进行概述

将所有数据进行输出显然不科学,数据量太大,人脑也无法对其进行分析。我们可以通过 DataFrame.describe() 函数对数据进行概述,他将会返回一个统计表供我们了解整个数据中的各项数值

print(df.describe())

describe 函数只会对数值列表进行统计,非数值数据将会被掠过。他将会列出以下几个数据供分析:

         Survived      Pclass         Age  Siblings/Spouses  Parents/Children       Fare  
count 887.000000 887.000000 887.000000 887.000000 887.000000 887.00000
mean 0.385569 2.305524 29.471443 0.525366 0.383315 32.30542
std 0.487004 0.836662 14.121908 1.104669 0.807466 49.78204
min 0.000000 1.000000 0.420000 0.000000 0.000000 0.00000
25% 0.000000 2.000000 20.250000 0.000000 0.000000 7.92500
50% 0.000000 3.000000 28.000000 0.000000 0.000000 14.45420
75% 1.000000 3.000000 38.000000 1.000000 0.000000 31.13750
max 1.000000 3.000000 80.000000 8.000000 6.000000 512.32920
  • Count - 数据总数量
  • Mean - 平均值
  • Std - 标准平方差(Standard Deviation),用于衡量数据的离散状态)
  • Min - 最小值
  • 25% - 25 分位数
  • 50% - 50 分位数 / 中位数
  • 75% - 75 分位数
  • Max - 最大值

We use the Pandas describe method to start building some intuition about our data.

我们使用Pandas的describe方法来开始建立对我们的数据的一些直观认识。

选择一个字段

我们需要对数据集中的一些列进行操作,如果需要选择其中一个列,我们使用方括号和列名 ['列名'],下边的例子就是选择乘客票价的列表

col = df['Fare']
print(col)

我们将 DataFrame 中的某一列称之为 Series,Series 也是 DataFrame 的一种,但是只有一列数据。

0       7.2500
1 71.2833
2 7.9250
3 53.1000
4 8.0500
...
882 13.0000
883 30.0000
884 23.4500
885 30.0000
886 7.7500
Name: Fare, Length: 887, dtype: float64

选择多个字段

我们当然可以选择数据集中的多个列来进行操作,创建一个小的 DataFrame。比如说我们选择 Age, Sex, Survived 列作为我们的小 DataFrame。要选取多个列,我们需要使用两个方括号 [['列名1', '列名2', ...]] 来完成,如下所示:

small_df = df[['Age', 'Sex', 'Survived']]
print(small_df.head())

当选择一列时,我们使用一个方括号,如果选择多列时,我们需要使用两个方括号。

    Age     Sex  Survived
0 22.0 male 0
1 38.0 female 1
2 26.0 female 1
3 35.0 female 1
4 35.0 male 0

创建一个字段

我们经常希望我们的数据以比其原始格式稍微不同的方式呈现。例如,我们的数据中的乘客性别是一个字符串(”male” 或 “female”)。这对于人类来说很容易阅读,但当我们稍后对数据进行计算时,我们希望将其表示为布尔值(True 和 False)。

上面提到,我们可以通过选取一列获得一个 pandas Series 类型数据。在这基础上,我们可以直接对整个 Series 进行一些逻辑操作,如:

print(df['Sex'] == 'male')

执行这段操作之后,相当于 Series 会将整个数据集中的每一行取进行对比,如果是 male 则为 True 反之为 False,最后得到一个新的 Series

0       True
1 False
2 False
3 False
4 True
...
882 True
883 False
884 False
885 True
886 True
Name: Sex, Length: 887, dtype: bool

那现在就需要创建一个列来保存这些数据,我们可以直接通过和选取列相同的代码来执行这个操作

df['Male'] = df['Sex'] == 'male'

以上这行代码将会在 df 数据集中创建一个新的数据列 Male。然后保存 df['Sex'] == 'male' 的结果。

同理,我们可以创建一个用来判断用户是否是头等舱的数据集

df['First Class'] = df['Pclass'] == 1