当我在jupyter笔记本中调用不带圆括号的函数describe时,结果是不同的,但是我希望在不带括号的情况下出现错误消息。
在搜索时,我仅找到有关describe()
的文章,而没有发现有关describe
的文章。我觉得这很傻,因为我敢肯定这很简单,但我还不明白。
代码如下:
file_path = '../input/data.csv'
data = pd.read_csv(file_path)
data.describe #instead of data.describe()
两个结果如下:
答案 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.sum
,data.query
,data.pivot
或data.__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)
存在过度简化的风险:
.describe
是NDFrame
类的一部分,可以调用该方法来获取框架的统计信息。
您通过调用describe()
函数来使用此方法。
有关更多详细信息和出色的低级解释,请参见Martijn's answer。