Pandas 数据帧行为:list(df) 与 len(df)

Pandas dataframe behavior: list(df) versus len(df)

我有一个数据框:

import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

如果我在这个对象上调用 list,我得到这个:

>>> list(df)
['A', 'B']

但是如果我在这个对象上调用 len,我得到这个:

>>> len(df)
3

后一个 len 调用对我来说更直观 - 就像查找可迭代对象中的元素数量一样。我不清楚 pandas.DataFrame 上的这两个函数调用背后的确切行为差异是什么。 dis.dis 的输出看起来非常相似:

>>> dis.dis('len(df)')
  1           0 LOAD_NAME                0 (len)
              2 LOAD_NAME                1 (df)
              4 CALL_FUNCTION            1
              6 RETURN_VALUE
>>> dis.dis('list(df)')
  1           0 LOAD_NAME                0 (list)
              2 LOAD_NAME                1 (df)
              4 CALL_FUNCTION            1
              6 RETURN_VALUE

所以我没有任何迹象表明为什么在 DataFrame returns 上调用 list 列名列表,而 len returns 中的行数物体。当我调用 len(df) 时,是否在 DataFrame 上调用了 this method

注意:listlen函数比较只是一个例子。我真的在寻找有关如何 pandas.DataFrames interact/behave 与各种功能交互的信息。

这是__len__pandasDataFrame对象中的定义:

def __len__(self):
    return len(self.index)

正如预期的那样,您得到了行数(我猜是设计决定?)

至于list(df),它和__iter__returns有什么关系,这里可以追溯到NDFrame,它是NDFrame的基类数据框,它说:

def __iter__(self):
    """Iterate over infor axis"""
    return iter(self._info_axis)

其中 _info_axis 是数据帧的列轴。