这十二个用于Python 数据操作的 Pandas 方法你还不知道?

Python 近年来成为数据科学领域最受欢迎的语言之一,其中一个重要原因就是 Python 具有大量方便易用的程序包和工具。而在这些库里面,Pandas 是数据科学操作中最实用的工具之一。本文就分享 12 个用于 Python 数据操作的 Pandas 方法,此外还补充了一些能提高你工作效率的技巧和建议。

首先我们导入模块,将数据集加载到 Python 环境中:

布尔索引

如果你想根据一定条件从一组列中筛选出一列的值,该怎么办?比如,我们想要一列,包含所有办了贷款且尚未毕业的女性名单。这里使用布尔索引就能帮上忙。可以使用如下代码:

APPLY函数

Apply 函数是用于处理数据和创建新变量的常用函数之一。对 DataFrame 的某行/列应用函数之后,Apply 返回一些值。函数既可以使用默认的,也可以自定义。比如,这里就可以用它来寻找每行和每列的缺失值。

这样我们就得到了理想结果。

注意:在第二个输出中应用 head() 函数,因为它包含了很多行。

替换缺失值

使用 fillna() 即可一步实现替换缺失值。它可以用目标列的平均值/众数/中位数更新缺失值。在下面的例子中,我们用‘Gender’,‘Married’和‘Self_Employed’这几列的众数替换它们的缺失值。

输出:

记住,众数有时也会是数组,因为可能会出现多个高频值。默认情况下我们用第一个:

输出:

现在我们就可以填充缺失值了,使用前面第 2 种方法进行检查。

经确认,缺失值已经被替换掉。注意,这只是一种常见的替换方法,还有其它复杂的方法,比如为缺失值建模。

数据透视表

Pandas 还可以用于创建 Excel 风格的数据透视表。例如,在我们这个例子中,数据的关键列就是包含了缺失值的‘LoanAmount’。我们可以用‘Gender’,‘Married’和‘Self_Employed’这几个组的平均值替换掉缺失值。这样每组的平均‘LoanAmount’可以确定为:

多索引

如果你留意一下第 3 种技巧的输出结果,你会发现它有一个奇怪的特点:每个索引由 3 个值组成。这就是多索引,它能加快我们的操作速度。

继续使用上面第 3 种技巧的例子,我们有每一组的值,但尚未估算缺失值。

我们可以使用之前用到的技巧来解决这个问题:

注意:

多索引需要用元组来定义 loc 语句中的索引组,这是在函数中用到的一个元组。

这里的 .values[0] 后缀是必需的,因为默认情况下会返回一系列的元素,这会产生一个和 DataFrame 不匹配的索引。在这个例子中,直接分配值会产生错误。

Crosstab

该函数用于对数据获取一个初步的“感觉”(概览)。这里,我们可以验证一个基本的假设。例如,在这个例子中,我们预计“Credit_History”会大幅影响借款状态。那么我们就可以用如下所示的交叉表进行测试:

这些都是绝对值。但是,使用百分比会更直观些。我们可以用 apply 函数来完成:

现在,很明显有信用历史的人获取贷款的几率更高:达到 80%,而没有信用的人只有 9%。

但事实并非如此简单。由于我们已知具有信用历史非常重要,那么如果我们将有信用历史的人的借款状态预测为 Y、无信用历史的人预测为 N,会怎样呢?我们会惊讶地发现,全部 614 次测试中有 82+378=460 次预测正确,准确率达到了 75%!

你可能会纳闷为何我们需要统计模型,但是你要知道,能将准确率提高哪怕 0.001% 也是一项非常艰难的挑战。

注意:75% 的准确率是在训练集上取得的准确率,在测试集上会略微不同,但也差不多。

合并DataFrame

如果我们有来自多个数据源的信息需要核对,那么合并 DataFrame 会是基本的操作。考虑一种假设情况,其中不同房产类型有不同的房产均价(每平米价格),我们将 DataFrame 定义为:

现在,我们就可以将该信息和初始 DataFrame 合并为:

通过数据透视表我们可以知道成功合并了。注意,‘values’参数和这里无关,因为我们只是简单计算值而已。

为DataFrame排序

Pandas 能让我们很容易地根据多个列进行排序,可以通过如下操作完成:

注意:Pandas 的“Sort”函数已经不能用了,我们应该使用“sort_values”来代替它。

绘图

可能有很多人不知道我们可以在 Pandas 上直接绘出箱型图和直方图,其实没必要额外调用 matplotlib。只需一行命令就行了。例如,如果我们想根据 Loan_Status 比较贷款申请人的收入分布情况:

从图表中可以看到,收入并不是一个很大的决定性因素,因为收到贷款的人和贷款被拒的人的收入之间并没有明显的差别。

将CUT函数用于数据组合

有时经过聚类处理后,数值会更有意义。例如,我们想为一天内的车流量建模(时间单位为分钟),精确到每小时每分钟对于预测车流量来说,可能相关度并不是那么高,使用一天中的实际时间段比如“早晨”“下午”“傍晚”“夜晚”“深夜”效果会更好。通过这种方式为车流量建模,会更直观,也能避免过拟合。

这里我们定义一个简单的函数,可以重新用于组合任何变量:

编码名目数据

通常我们会遇到一种情况,也就是必须修改名义变量的类别。这可能是因为多个原因:

一些算法(比如逻辑回归)需要所有输入为数值型。因而名义变量大部分编写为0,1···(n-1)。

有时一个类别可以表示为两种方式。例如,温度可以记录为“High”“Medium”和“Low”,或“H”“low”,这里的“High”和“H”都表示同一类别。同样地,“Low”和“low”也只是有略微区别而已。但是,Python会把它们读取为不同的等级。

有些类别出现的类别可能会很低,所以将它们合并通常是个好主意。这里我们定义一个通用函数,它的输入为字典形式,然后会用 Pandas 中的‘replace’函数将输入值编码。

迭代DataFrame的行

这项技巧并不经常用到,但万一遇到此类难题时就不怕了,对吧?有些情况下,你可能会用一个 for 循环迭代所有的行。例如,我们面临的一个常见问题就是没有正确对待 Python 中的变量。通常出现在下面两种情况中:

有数字类别的名义变量被当成数值变量

当某一行带有字符(因为数据错误)的数值变量被当成分类变量

所以,手动定义列的类型往往是个更好的办法。如果我们检查所有列的数据类型:

这里我们可以看到 Credit_History 是一个名义变量,但却出现为浮点值。解决该问题的一个好方法就是创建一个 CSV 文件,带有列名和类型。通过这种方法,我们可以写一个通用函数来读取该文件,并分配列数据类型。例如,这里我们创建了一个 CSV 文件 datatypes.csv。

在加载该文件后,我们就可以迭代每一行,用列“type”向“feature”列中定义的变量名分配数据类型。

这样 Credit_History 列就被修改为“对象”类型,可以用于表示 Pandas 中的名义变量。

结语

在本文,我们探究了 Pandas 中的多个技巧,能让我们在使用 Pandas 操作数据和执行特征工程时更方便更高效。另外,我们也定义了一些通用函数,可重新用于在不同数据集上实现同样的效果。

本文搬运自友商景略集智

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181031A0CVCE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券