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