【发布时间】:2019-03-09 23:50:57
【问题描述】:
试图了解 Pandas 某些功能背后的设计原理。
如果我有一个 3560 行 18 列的 DataFrame,那么
len(frame)
是 3560,但是
len([a for a in frame])
18 岁。
也许这对来自 R 的人来说很自然;对我来说,感觉不是很“Pythonic”。是否在某处介绍了 Pandas 的基本设计原理?
【问题讨论】:
试图了解 Pandas 某些功能背后的设计原理。
如果我有一个 3560 行 18 列的 DataFrame,那么
len(frame)
是 3560,但是
len([a for a in frame])
18 岁。
也许这对来自 R 的人来说很自然;对我来说,感觉不是很“Pythonic”。是否在某处介绍了 Pandas 的基本设计原理?
【问题讨论】:
DataFrame 主要是基于列的数据结构。 在底层,DataFrame 中的数据存储在块中。粗略地说,每个 dtype 都有一个块。 每一列都有一个数据类型。因此,可以通过从单个块中选择适当的列来访问列。相反,选择单行需要从每个块中选择适当的行,然后形成一个新的系列并将每个块的行中的数据复制到系列中。 因此,遍历 DataFrame 的行(在底层)不像遍历列那样自然。
如果您需要遍历行,您仍然可以通过调用df.iterrows()。您应该尽可能避免使用df.iterrows,原因与它不自然的原因相同——它需要复制,这使得过程比遍历列更慢。
【讨论】:
docs 中有一个不错的解释——Pandas DataFrames 的迭代意味着“类似字典”,所以迭代是在键(列)上。
可以说,Series 的迭代超过值有点令人困惑,但正如文档所述,这是因为它们更像“数组”。
【讨论】: