首页 > 解决方案 > 了解列表与系列中的 Python 语法

问题描述

我是数据科学领域的 Python 新手(没有计算机科学背景)。我一直听说 Python 很简单,但我正在逐步取得进步。例如,我理解:

len(titles[(titles.year >= 1950) & (titles.year <=1959)])

“在标题数据框中,创建一个系列并从标题数据框的年份列中获取大于或等于 1950 和小于或等于 1959 的任何内容。取它的长度。”

但是当我遇到以下情况时,我不明白其中的逻辑:

t = titles
(t.year // 10 * 10).value_counts().sort_index().plot(kind='bar')

或者

titles.title.value_counts().head(10)

在这两种情况下,我显然可以拼凑起来。但目前尚不清楚。其次,为什么 Python 不允许我像第一个示例中那样使用方括号和正则括号?

标签: pythonpandassyntax

解决方案


这不是关于listsvs pd.Series,而是关于Python中括号 ( ()) 与括号 ( ) 的功能。[]

括号主要用于两种情况:修改操作的优先顺序,以及在调用函数时分隔参数。

1 + 2 * 3and之间的区别(1 + 2) * 3是显而易见的,如果你想将aand传递b给一个函数ff a b它将不起作用,这与 Haskell 不同。

我们主要关心这里的第一次使用;例如,在这一行中:

(t.year // 10 * 10).value_counts().sort_index().plot(kind='bar')

如果没有括号,您将调用该方法链 on 10,这是没有意义的。显然,您想根据括号表达式的结果调用它们。

现在,在数学中,括号也可以与括号一起用于表示优先级,以防多个嵌套括号会造成混淆。例如,两者在数学上可能是等价的:

[(1 + 2) * 3] ** 4
((1 + 2) * 3) ** 4

但是,在 Python 中情况并非如此:((1 + 2) * 3) ** 4可以求值,而[(1 + 2) * 3] ** 4is a TypeError,因为括号内的部分解析为 a list,并且您不能对 执行求幂lists

相反,在类似的事情中发生的事情与titles[titles.year >= 1950]优先级没有直接关系(当然,括号外的任何内容都不会成为内部表达式的一部分)。

相反,括号表示索引;在某种程度上, 的值titles.year >= 1950用于从中获取元素titles(这是使用__getitem__dunder 方法的重载来完成的)。

此索引的确切性质可能不同;lists取整数,dicts取任何可散列的对象pd.Series,除其他外,取布尔值pd.Series(这就是这里发生的事情),但它们最终代表了对索引对象进行子集化的某种方式。

因此,在语义上,我们可以看到括号的含义与括号不同,并且不可互换。

为了完整起见,使用方括号而不是圆括号有一个切实的好处:它允许重新分配,因为它会根据是否正在执行分配自动委托给__setitem__or 。__getitem__

因此,如果你愿意,你可以做类似的事情titles[titles.year >= 1950] = 'Nothing'。但是,在所有情况下,titles(titles.year >= 1950) = 'Nothing'委托给__call__, and 因此都会以下列方式失败:

SyntaxError: can't assign to function call

推荐阅读