为什么Pandas默认按列迭代DataFrame?

9

我尝试理解Pandas一些特性背后的设计原理。

如果我有一个包含3560行和18列的DataFrame,则

len(frame)

是3560,但是

len([a for a in frame])

年龄为18岁。

对于熟悉R语言的人来说,这种方式可能很自然;但对我来说,这并不像是很符合Python风格的。有没有一些介绍Pandas底层设计理念的入门资料呢?


好问题!我直觉上希望 len 与迭代一致... :-/ - Michel de Ruiter
2个回答

15

一个DataFrame主要是基于列(column)的数据结构。在底层,DataFrame内部的数据是按块存储的。 大体上来说,每个dtype有一个块。每个列有一个dtype。因此,通过从单个块中选择适当的列来访问列可以完成。相反,选择单个行需要从每个块中选择适当的行,然后形成一个新的Series,并将每个块的行数据复制到Series中。 因此,遍历DataFrame的行(在底层)不像遍历列那么自然。

如果您需要遍历行,仍然可以通过调用df.iterrows()来实现。应尽可能避免使用df.iterrows(),原因是它需要进行复制,这使得该过程比遍历列更慢。


5
文档中有一个不错的解释 - Pandas DataFrame 的迭代是“类似于字典”的,所以迭代是对键(列)进行的。
可以说 Series 的迭代会有些混淆,因为文档指出它们更像数组,所以迭代是在值上进行的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接