【问题标题】:Pandas dataframe behavior: list(df) versus len(df)Pandas 数据框行为:list(df) 与 len(df)
【发布时间】:2017-10-05 00:47:26
【问题描述】:

我有一个数据框:

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 上调用 list 返回列名列表,而 len 返回对象中的行数。当我打电话给len(df) 时,this method 是否被DataFrame 调用?

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

【问题讨论】:

    标签: python dataframe behavior


    【解决方案1】:

    这是__len__pandasDataFrame对象中的定义:

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

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

    至于list(df),它与__iter__返回的内容有关,在这种情况下,您可以追溯到NDFrame,它是数据帧的基类,它说:

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

    _info_axis 是 DataFrame 的列轴。

    【讨论】:

    • 当我打电话给len(df) 时,熊猫如何“知道”打电话给__len__? AFAIK,如果我在任意对象的 __foo__ 方法上调用函数 foo,则该行为不起作用。
    • pandas 不知道,但是 python class 知道。换句话说,__len__ 是任何类都可以实现来定义len(<class_object>) 的魔术方法,就像__ge__ 是类可以实现来定义 >= 运算符的魔术方法一样。知道这一点,df 只不过是 DataFrame 类的对象。
    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2015-12-12
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多