Dat*_*ob7 10 python syntax pandas
我是Python的新手(无计算机科学背景)用于数据科学。我一直在听说Python很简单,但是我正在逐步取得进步。例如,我了解:
len(titles[(titles.year >= 1950) & (titles.year <=1959)])
Run Code Online (Sandbox Code Playgroud)
“在标题数据框中,创建一个序列,并从标题数据框的Year列中获取大于或等于1950且小于或等于1959的任何值。取其长度。”
但是,当我遇到以下情况时,我不了解以下逻辑:
t = titles
(t.year // 10 * 10).value_counts().sort_index().plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)
要么
titles.title.value_counts().head(10)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都可以将其组合在一起。但是还不清楚。在第二篇文章中,为什么Python不允许我像第一个示例一样使用方括号和常规括号?
gmd*_*mds 14
这lists
与vs 无关pd.Series
,而是()
与[]
Python 中括号()vs方括号()的功能有关。
在两种主要情况下使用括号:修改操作的优先顺序,以及在调用函数时分隔参数。
之间的区别1 + 2 * 3
和(1 + 2) * 3
是显而易见的,如果你想通过a
和b
一个功能f
,f a b
在,比方说,哈斯克尔是行不通的,不像。
我们主要关心这里的首次使用;例如,在这一行:
(t.year // 10 * 10).value_counts().sort_index().plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)
没有括号,您将在上调用该方法链10
,这没有任何意义。显然,您希望在括号表达式的结果上调用它们。
现在,在数学中,如果多个嵌套括号会造成混淆,括号也可以与括号一起用于表示优先级。例如,两者在数学上可能是等效的:
[(1 + 2) * 3] ** 4
((1 + 2) * 3) ** 4
Run Code Online (Sandbox Code Playgroud)
但是,在Python中不是这种情况:((1 + 2) * 3) ** 4
可以求值,而是[(1 + 2) * 3] ** 4
a TypeError
,因为括号内的部分解析为a list
,并且您不能对进行幂运算lists
。
相反,发生在类似事件中的事情与titles[titles.year >= 1950]
优先级没有直接关系(尽管当然,括号之外的任何内容都不是内部表达式的一部分)。
相反,方括号代表索引;以某种方式,使用的值titles.year >= 1950
来获取元素titles
(使用__getitem__
dunder方法的重载来完成)。
此索引的确切性质可能有所不同;lists
接受整数,dicts
接受任何可散列的对象以及pd.Series
接受boolean pd.Series
(这就是这里发生的一切)的方法,但它们最终代表了某种方法来对索引对象进行子集化。
因此,从语义上,我们可以看到括号的含义不同于括号,并且不能互换。
为了完整起见,使用括号而不是括号有一个明显的好处:它允许重新分配,因为它会根据是否执行分配自动将其委托给__setitem__
或__getitem__
。
因此,您可以根据需要执行类似操作titles[titles.year >= 1950] = 'Nothing'
。但是,在所有情况下,的titles(titles.year >= 1950) = 'Nothing'
委托都将__call__
因此而失败,原因如下:
SyntaxError: can't assign to function call
Run Code Online (Sandbox Code Playgroud)
方括号用于列表和字典的索引(以及类似的东西)。另一方面,由于多种原因而使用括号。在这种情况下,它们用于(t.year // 10 * 10)
在value_counts()
其他地方分组或作为函数调用。
对于像pandas这样的库,是使用索引符号[]
还是使用函数调用完全取决于该库的实现。您可以通过教程和库的文档了解这些详细信息。
在深入研究pandas库之前,建议您学习Python语法的基础知识。官方教程是一个不错的起点。
另外,编写代码时,请不要使每一行都像在这些示例中看到的那样复杂。相反,您应该将事情分解成较小的部分,并将中间部分分配给变量。例如,您可以
(t.year // 10 * 10).value_counts().sort_index().plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)
然后变成
decade = (t.year // 10 * 10)
counts = decated.value_counts()
sorted = counts.sort_index()
sorted.plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)