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

时间:2019-05-15 00:05:30

标签: python pandas syntax

我是不熟悉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不允许我像第一个示例一样使用方括号和常规括号吗?

3 个答案:

答案 0 :(得分:12)

这与listspd.Series无关,而是与Python中括号(())和方括号([])的作用有关。

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

1 + 2 * 3(1 + 2) * 3之间的区别是显而易见的,如果您要将ab传递给函数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是该框架中的一列。按顺序进行操作

  • 将年份除以10(整数除法)并乘以10。这会将最后一位数字截断为0,因此每年都是十年的开始。结果是另一列,其长度与原始列相同。
  • 计算值;这将产生一个新表,其中包含每十年的条目(年,频率)。
  • 按默认索引对表进行排序
  • 绘制结果的条形图。

这能让你前进吗?