了解列表vs系列中的Python语法

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是显而易见的,如果你想通过ab一个功能ff 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] ** 4a 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)


Cod*_*ice 5

方括号用于列表和字典的索引(以及类似的东西)。另一方面,由于多种原因而使用括号。在这种情况下,它们用于(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)