【问题标题】:Understanding Python syntax in lists vs series了解列表与系列中的 Python 语法
【发布时间】:2019-05-15 00:05:30
【问题描述】:

我是数据科学领域的 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 不允许我像第一个例子那样使用方括号和正则括号?

【问题讨论】:

  • 副手,这似乎不仅仅是“香草”蟒蛇。您有正在使用的库吗? (numpy、scipy、anaconda 等)如果您必须运行“pip”命令,则会安装库。记下/标记您正在使用的库会很有帮助。
  • @MarkRibau 看起来像pandas
  • 从“dataframes”这个词来看,pandas 是对的。
  • 您希望在其他示例中在哪里使用方括号?
  • 您也可以在t.year 上使用方括号,只是不要。我不确定我是否理解你的困惑,你能详细说明一下吗?

标签: python pandas syntax


【解决方案1】:

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

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

1 + 2 * 3(1 + 2) * 3 之间的区别很明显,如果你想将 ab 传递给函数 ff a b 将不起作用,这与在 Haskell 中不同。

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

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

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

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

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

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

相反,titles[titles.year &gt;= 1950] 之类的内容与优先级没有直接关系(当然,括号外的任何内容都不会成为内部表达式的一部分)。

相反,括号代表索引;在某种程度上,titles.year &gt;= 1950 的值用于从titles 获取元素(这是通过__getitem__ dunder 方法的重载来完成的)。

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

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

为了完整起见,使用括号而不是圆括号有一个明显的好处:它允许重新分配,因为它会根据是否执行分配自动委托给__setitem____getitem__

因此,如果您愿意,可以执行 titles[titles.year &gt;= 1950] = 'Nothing' 之类的操作。但是,在所有情况下,titles(titles.year &gt;= 1950) = 'Nothing' 都委托给__call__,因此会以下列方式失败:

SyntaxError: can't assign to function call

【讨论】:

  • “现在,在数学中,括号也可以与括号一起用于表示优先级,以防多个嵌套括号会造成混淆。”如果 OP 熟悉代数中的这种用法,这可能会引起主要的困惑。
  • 哇,感谢您的精彩回复。是的,虽然我的代数背景很小,但这确实让我在学习 Python 时感到有些困惑。这就是重点 - [] vs ()。特别是在熊猫中。我试图能够理解逻辑,(因此是我的内在心理)。那么在 Pandas 中,[] 是用于索引而不是制作系列吗?
  • @DataNoob7 请记住,索引会创建某种形式的子集!所以,如果你有一个Series,你可以索引它来获得另一个 Series。如果您指的是原始数据,那么这是一个函数调用 - 类似于 pd.Series(data)
  • @gmds 愚蠢的问题 - 如何在计算机科学中定义索引。对我来说,“索引”这个词只是创建一个“目录”来识别事物的不同部分。但是您实际上还没有提取任何东西。所以你的短语“索引创建某种形式的子集”让我失望。对我来说,您只是为您的数据框分配了一个数字、一个字母等,所以您还没有获取任何内容的子集?
  • @DataNoob7 在这种情况下,“索引”是您对 collection 执行的操作,它是一个包含数字(包括一个或零)对象的对象。集合的示例是 liststuplesdictspd.Series。索引基本上告诉集合根据传递给索引函数的参数返回它包含的对象的一些子集。例如,对于lists,您传递整数索引并获取这些位置的元素。
【解决方案2】:

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

【讨论】:

  • 我必须同意。如果刚刚开始(特别是如果您是一般编程新手),请先从 python 基础开始,然后再使用 pandas、numpy 等进入数据科学部分。
  • @anyone 我知道sorted 在这里是个坏名字,因为内置函数。如果有人有更好的建议,请随时编辑。
  • sorted_counts 或者更具体的(不幸的是,冗长的)index_sorted_counts 怎么样?
  • 我已经通过其他方式开始了“Python基础”,但我会查看官方教程。我有很多需要分析工作的数据(许多数据集从 70 万到 4000 万不等),所以我需要加快速度。令人沮丧的部分是我知道我必须做什么,但是将其翻译成 Python 代码非常困难。我理解 [] 表示熊猫中的一个系列,但它也是索引?在熊猫之外建立索引?就代码长度而言——也许这就是问题所在。
  • @DataNoob7 “我理解 [] 表示 pandas 中的系列” “表示”一词在这里可能非常具有误导性,并且不是正确的思考方式。 []索引一个对象。当你索引一个整数列表时,结果是一个整数。另一方面,当您索引数据框时,结果是一个系列。这与“表示”不同。更重要的是,如果您认为[] 始终是索引,它适用于所有用途,而不是为每种用途制定特殊情况。
【解决方案3】:
t = titles
(t.year // 10 * 10).value_counts().sort_index().plot(kind='bar')

titles 是一个数据框。 year 是该框架中的一列。按顺序,操作是

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

这能让你继续前进吗?

【讨论】:

  • 谢谢 - 我可以理解代码的含义,它理解代码为什么这样写的逻辑(参见我的原始帖子)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2019-06-20
  • 1970-01-01
  • 2023-01-02
  • 2018-11-19
  • 2023-03-29
相关资源
最近更新 更多