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/
译者:张新英
领取专属 10元无门槛券
私享最新 技术干货