试图了解一些熊猫特征背后的设计理念。
如果我有一个包含3560行和18列的DataFrame,那么
len(frame)
是3560,但是
len([a for a in frame])
是18岁。
对于来自R的人来说,这感觉很自然;对我而言,感觉不是'Pythonic'。 Pandas在某处有基础设计理论的介绍吗?
答案 0 :(得分:15)
DataFrame主要是基于列的数据结构。 在引擎盖下,DataFrame内的数据存储在块中。粗略地说,每个dtype都有一个块。 每列都有一个dtype 。因此,可以通过从单个块中选择适当的列来完成对列的访问。相反,选择单行需要从每个块中选择适当的行,然后形成一个新的Series并将每个块的行中的数据复制到Series中。 因此,迭代DataFrame的行(在引擎盖下)并不像迭代列那样自然。
如果您需要遍历行,您仍然可以通过调用df.iterrows()
来完成。如果可能的话,你应该避免使用df.iterrows
,原因与它不自然的原因相同 - 它需要复制,这使得进程比迭代遍历列更慢。
答案 1 :(得分:4)
在docs迭代中有一个不错的解释,Pandas DataFrames的意思是“像dict一样”,所以迭代是在键(列)之上。
可疑的是,对于Series的迭代超过了值,这有点令人困惑,但正如文档所指出的那样,那是因为它们更像是“类似数组”。