熊猫“ describe”和“ describe()”有什么区别?

时间:2020-03-13 21:06:02

标签: python pandas jupyter-notebook

当我在jupyter笔记本中调用不带圆括号的函数describe时,结果是不同的,但是我希望在不带括号的情况下出现错误消息。 在搜索时,我仅找到有关describe()的文章,而没有发现有关describe的文章。我觉得这很傻,因为我敢肯定这很简单,但我还不明白。

代码如下:

file_path = '../input/data.csv'
data = pd.read_csv(file_path)
data.describe #instead of data.describe()

两个结果如下:

describe()describe() result

描述describe

3 个答案:

答案 0 :(得分:4)

.describe是绑定方法。它已绑定到您的数据框,并且绑定方法的 representation 包括其绑定到的内容的repr()输出。

您可以在输出的开头看到它:

<bound method NDFrame.describe of ...>

rest repr(data)产生的字符串相同。

请注意,Python交互式解释器始终回显最后生成的表达式的表示形式(除非它生成了None)。 data.describe生成绑定方法,data.describe()生成该方法设计生成的内容。

您可以为任何绑定方法创建相同类型的输出:

>>> class Foo:
...     def __repr__(self):
...         return "[This is an instance of the Foo class]"
...     def bar(self):
...         return "This is what Foo().bar() produces"
...
>>> Foo()
[This is an instance of the Foo class]
>>> Foo().bar
<bound method Foo.bar of [This is an instance of the Foo class]>
>>> Foo().bar()
"This is what Foo().bar() produces"

请注意,Foo()有一个自定义的__repr__方法,该方法称为生成实例表示的方法。

对于实际上没有调用的数据框上的任何方法,您可以看到相同类型的输出(整个数据框的表示),例如data.sumdata.querydata.pivotdata.__repr__

绑定方法是Python调用实例时将实例作为第一个参数传递的过程的一部分,该参数通常命名为self。它基本上是一个代理对象,它引用原始函数(data.describe.__func__)和要在所有其他参数(data.describe.__self__)之前传递的实例。有关绑定如何工作的详细信息,请参见descriptor HOWTO

如果您想将绑定方法的__repr__实现表示为Python代码,则应为:

def __repr__(self):
    return f"<bound method {self.__func__.__qualname__} of {self.__self__!r}>"

答案 1 :(得分:1)

输出告诉您发生了什么,但是需要一些解码。致电df.describe时,您会得到

bound method NDFrame.describe of <your dataframe

换句话说,它返回describe方法的描述,即bound对您的数据框对象

尽管没有完全类似,因为它没有绑定到对象,但与以下情况类似,在此情况下,我们定义了一个在__main__名称空间上运行的函数,然后在带括号和不带括号的情况下调用它

def myfunc():
    return "hello world"

myfunc()

'hello world'

myfunc #no parentheses

<function __main__.myfunc()>

请注意第二种情况,它告诉我们它是一个函数,其名称为myfunc,并且它“绑定”到__main__命名空间而不是对象(不是完全正确,但足够接近) )

答案 2 :(得分:1)

存在过度简化的风险:
.describeNDFrame类的一部分,可以调用该方法来获取框架的统计信息。

您通过调用describe()函数来使用此方法。

有关更多详细信息和出色的低级解释,请参见Martijn's answer