你可能不知道的10个Python Pandas的技巧和特性(下)

6. 通过迭代自检Groupby对象

当你调用df.groupby("x")时,生成的Pandas groupby对象可能有点难懂。这个对象是延迟实例化的,并且本身没有任何有意义。

你可以用示例1中的鲍鱼数据集来演示:

好吧,现在你有一个groupby对象,但是这是什么东西,我怎么看呢?

在调用类似grouped.apply(func)之前,可以利用groupby对象是可迭代的事实:

由grouped.__iter__()产生的每个“事物”都是一个元组(name, subsetted object),其中name是正在分组的列的值,subsetted object是一个DataFrame,它是基于你指定的任何分组条件的原始DataFrame的子集。也就是说,数据被分组:

与之相关的是,groupby 对象也具有.groups和group-getter, .get_group():

这可以帮助你更加确信,你正在执行的操作是你想要的:

不管对grouped执行什么计算,不管是单个Pandas方法还是定制的函数,这些“子框架”中的每一个都将作为一个参数逐个传递给该可调用对象。这就是术语“split-apply-combine(化整为零)”的来源:按组分解数据,执行每组计算,并以某种聚合方式重新组合。

如果你无法准确地可视化这些组实际是什么样子,那么只需迭代并打印一些就非常有用。

7. 使用映射技巧来进行成员分类

假设你有一个序列和相应的“映射表”,其中每个值都属于一个多成员组,或者根本不属于任何组:

换句话说,你需要把countries映射到以下结果:

你需要的是一个类似于Pandas的pd.cut()的函数,但它是基于分类成员的。你可以使用pd.Series.map()来模拟这个,在示例5中已经看到了这一点:

这应该比countries中每个国家按照groups嵌套Python循环要快得多。

这是一个测试驱动:

让我们来解释一下这里发生了什么。(旁注:这是一个用Python的调试器pdb进入函数范围,来检查哪些变量是函数本地的好机会。)

目标是将groups中每个组映射为整数。

但是,Series.map()不能识别"ab"——它需要分隔版本,每个组中的每个字符都映射到一个整数。这就是字典推导式所做的事情:

这个字典可以传递给s.map(),将其值映射或“转换”它的值为相应的组索引。

8.了解Pandas如何使用布尔运算符

你可能熟悉Python的操作符优先级,其中and、not、和or比诸如、>=、!=和==之类的算术操作符具有更低的优先级。考虑下面的两个语句,其中比and运算符具有更高的优先级:

注:这不是Pandas相关的特定的,3 and 5计算结果为5,是因为短路短路求值:

“短路运算符的返回值是最后一个评估参数。”(来源)

Pandas (和在上面建造Pandas的NumPy)不使用 and、 or或not。相反,它分别使用&、|和~, 他们是常规的,真正的Python位运算符。

这些运算符不是Pandas“发明”的。相反,&、|、和~ 是有效的Python内置运算符,它们具有比算术运算符高(而不是更低)的优先级。(Pandas重写了类似于.__ror__()的函数映射为|操作符。)牺牲一些细节,你可以把“按位”想象成“按元素”,因为它与Pandas和NumPy有关:

完全理解这个概念是值得的。假设你有一系列像这样的Series:

我猜你可能已经看到了在某个点产生的异常:

这里发生了什么事?用圆括号递增地绑定表达式很有帮助,说明Python如何一步一步地扩展这个表达式:

表达式 s % 2 == 0 & s > 3 相当于(或被处理为)((s % 2) == (0 & s)) and ((0 & s) > 3)。这叫做展开式:x

好了,现在就停下来,让我们把它带回Pandas。你有两个Pandas Series,我们将称为left和right:

你知道left and right是真值测试,如下所示:

问题是Pandas开发者故意不为整个Series建立一个真值(真实性)。Series是真的还是假的?谁知道呢?结果是模棱两可的:

唯一有意义的比较是元素比较。这就是为什么,如果涉及算术运算符,则需要括号:

简而言之,如果你看到弹出来上面的ValueError并带有布尔索引,那么你可能应该做的第一件事情是添加必要的括号。

9.从剪贴板加载数据

通常需要将数据从Excel或Sublime Text之类的地方传输到Pandas数据结构。理想情况下,你希望做到这一点,而不执行将数据保存到文件中,然后将文件读取到Pandas的中间步骤。

利用pd.read_clipboard(),你可以从计算机的剪贴板数据缓冲区加载到DataFrames。它的关键字参数传递给pd.read_table()。

这允许你直接将结构化文本复制到DataFrame或Series。在Excel中,数据看起来是这样的:

它的纯文本表示(例如,在文本编辑器中)将是这样的:

只是强调并复制上面的明文,调用pd.read_clipboard():

10.直接将Pandas对象写入压缩格式

这个是简短明了的为了充实清单。自Pandas版本0.21.0起,你可以将Pandas对象直接写入gzip、bz2、zip或xz压缩,而不是将未压缩的文件存储在内存中并进行转换。

下面是一个使用技巧1的鲍鱼数据的例子:

在这种情况下,尺寸差异为11.6x:

如果想添加到这个列表中?告诉我们吧

希望你能够从这个列表中学到一些有用的技巧,使你的Pandas代码具有更好的可读性、通用性和性能。

如果你有这里不包含的什么高招,请在评论中留下建议或创建GitHub Gist。我们将很高兴地添加到这个列表中,并在适当处标明出处。

英文原文:https://realpython.com/python-pandas-tricks/

译者:张新英

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180909A0DQXK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券