本文概述
- Python字典和数据科学工具箱
- 如何创建Python字典
- 在Python字典中加载数据
- 如何在Python中过滤字典
- Python字典操作
- 如何在Python中对字典进行排序
- 字典与Python列表, NumPy数组和Pandas DataFrames的比较
- 下一步是什么?
Python字典和数据科学工具箱
作为从事Python工作的数据科学家, 你需要始终将数据临时存储在适当的Python数据结构中以进行处理。 Python本地提供的一种特殊数据结构是字典。它的名称已经说明了数据的存储方式:可以通过你手边的一个键(单词)访问的数据或值。
如果你在纸质字典中查找” python”一词, 比方说《牛津英语词典》, 通常会先尝试浏览字典中包含以” p”开头, 然后是” y”开头的单词的部分。 , ” t”等, 直到你敲出完整的单词为止。词典条目将告诉你” python”是一条大型无毒蛇, 会限制其猎物或高级编程语言(!)。
纸质词典只是一种受人尊敬的辅助工具, 因为它的单词是按字母顺序排列的, 并且经过一些实践, 你可以在一分钟内找到其中的任何单词。 Python字典的工作方式类似:可以通过它们的键非常快速地检索存储的字典项。例如, 与Python列表不同, Python会跟踪在何处查找特定信息。
在今天的教程中, 你将了解有关以下主题的更多信息:
- 如何使用大括号和冒号创建字典,
- 如何借助urllib和随机库在字典中加载数据,
- 如何在for循环和特殊迭代器的帮助下过滤字典以遍历字典的键和值,
- 如何对字典执行操作以从字典中获取或删除值, 以及如何使用字典理解从字典中获取值的子集,
- 如何使用re库对词典进行排序, 以及如何在执行此操作时方便使用OrderedDict和lambda函数, 以及
- Python字典与列表, NumPy数组和Pandas DataFrames进行比较的方式。
开始吧!
如何创建Python字典
假设你要通过将每种水果的数量存储在字典中来清点水果篮中剩余的水果。有多种方法来构造字典, 但是对于本教程, 我们将使其保持简单。有关完整的概述, 请查阅字典上的Python文档。
可以识别字典的最重要功能是大括号{}, 对于字典中的每个项目, 键和值之间用冒号(:)分隔。
你可以自己尝试, 下面的变量fruit是有效的字典, 并且可以通过将键放在方括号[]之间来访问字典中的项目。另外, 你也可以使用.get()方法执行相同的操作。
在Python字典中加载数据
现在, 你将一些实际数据放入字典中, 更具体地说, 是嵌套字典(意味着以字典作为其值而不是例如字符串或整数的字典)。
这样, 表格或矩阵可以轻松地存储在字典中。
所使用的数据是Irivine机器学习存储库中Donna Tartt的Amazon书评中的The Goldfinch的评论。这些评论已存储在一个简单的制表符分隔文件中, 无非就是带有列的纯文本文件。该表包含四列:审阅分数, URL, 审阅标题和审阅文本。
有几种方法可以将其放入字典中, 但是在这种情况下, 你将url作为字典键, 并将其他列放入嵌套值字典中。
在这种情况下, 你很幸运获得了没有缺失值的数据集。当然, 并非总是如此。当你开始使用真实数据集时, “从头开始”的数据集通常很麻烦(格式错误, 编码错误, 数据丢失等)。为简单起见, 本教程没有在上面的脚本中提供任何内容来应对此处的缺失值, 但是通常需要考虑这一点。
但是, 你可以通过比较文件中的行数与字典键的数量, 轻松地验证字典中是否存在所有键。在这种情况下, 这告诉你进行数据处理是安全的。
如何在Python中过滤字典
现在, 亚马逊评论已存储在词典中, 是时候尝试对其进行一些操作了。假设你对不良评论感兴趣, 并希望仅选择评分为1.0的评论, 看看人们的实际写意
评论分数存储在字典值中, 这意味着你必须遍历字典。不幸的是(虽然不是真的), 你不能简单地使用for循环遍历字典对象。 Python字典项目不仅具有键和值, 而且还具有特殊的迭代器来循环它们。代替字典中的item, 你需要使用dictionary.items()中的key和value, 使用此特定的迭代器并使用key和value这两个变量, 而不是单个变量。同样, 键(.keys())和值(.values())有单独的迭代器。
你可以将分数较低的评论关键字存储在名为lowscores的列表中, 以便以后可以重新使用列表从字典中检索它们。
Python字典操作
如果包含完整数据集的字典很大, 则使用刚刚编译的低分列表创建一个全新的字典可能更明智。优点在于, 为了进行进一步的分析, 你无需将大词典保留在内存中, 而可以继续处理原始数据的相关子集。
首先, 你使用存储在低分中的键来创建新词典。有两种选择:一种是使用.get()方法从原始字典中检索相关项目, 而保留原始内容不变, 另一种使用.pop()确实将其从原始字典中永久删除。
子集的代码可能如下所示:subset = dict([(k(在低分数中为k的reviews.get(k)))])。由于循环是用单行代码编写的, 因此这种表示法可能看起来并不熟悉。这种风格被称为”字典理解”, 但实际上是伪装的for循环, 从低分中遍历所有项目, 从评论中获取值, 然后使用这些值来填充新词典。它与列表理解非常相似, 但是很明显, 它输出字典而不是列表。
但是, 如果你还不熟悉这种编程风格, 则不建议你使用理解。写出的for循环更容易阅读和理解。但是, 由于你经常需要阅读别人的代码, 因此你至少应该能够识别它。你可以在此处阅读有关字典理解的更多信息。
你可以将传统的for循环样式与字典理解进行比较, 并验证它们确实产生了完全相同的结果:
假设你现在想重新排列字典, 以使评分作为字典关键字而不是ID。你可以为此使用for循环, 同时指定键和值并构建新的嵌套字典。你必须从最初嵌套的字典中检索”分数”, 才能将其用作新关键字。
为了稍微简化代码, 你可以在单独的行上将新的嵌套字典作为对象newvalues创建, 然后将id用作键, 将newdicts字典作为其值填充scoredict:
如何在Python中对字典进行排序
在努力将实际数据集加载到字典中时, 现在可以对其进行一些基本分析。如果你对与小说的消极情绪并存的单词感兴趣, 则可以通过制作负面评论中单词的频次列表(得分1.0)来进行低层次的情感分析。
你需要通过删除HTML标记并将大写单词转换为小写字母来稍微处理审阅文本。首先, 我们使用正则表达式删除所有标签:re.sub(” <。*?>”, “”)。正则表达式是处理文本数据时非常有用的工具。它们的编译非常复杂, 并且绝对值得(有抱负的)数据科学家使用它们自己的教程。
但是, 在此示例中, 你只需要掌握以<开头, 后跟任意字符的未知数字(包括0), 再以>开头的内容, 则该内容不替换为””(空引号)。
Python具有一个内置函数, 只需将.lowercase()函数链接到字符串, 即可从单词中去除大写字母。这样, 你避免将大写的单词(因为它们出现在句子的开头)视为单独的单词。当然, 在某些情况下, 大写字母代表不同的单词, 但是要检测到这些单词需要进行一些高级的文本处理(称为命名实体识别), 但这超出了Python词典的范围。
接下来, 你使用defaultdict而不是普通词典来构建频率词典。这样可以确保每个”键”都已经初始化, 你可以将频率计数增加1。
如果你未使用defaultdict, 则在你首次尝试增加计数(从0到1)时, Python会引发错误, 因为该键尚不存在。可以通过在增加其值之前先检查字典中是否存在键来克服此问题, 但是与defaultdict相比, 此解决方案远非优雅。
频率字典准备就绪后, 你仍然需要按值降序对键进行排序, 以迅速查看哪些单词频率很高。由于普通字典(包括defaultdict不能通过设计进行排序), 因此需要另一个类, 即OrderedDict。它按照添加项目的顺序存储字典。在这种情况下, 你需要先对项目进行排序, 然后再将其存储在新的OrderedDict中。
排序的函数带有3个参数。第一个是要排序的对象, 即频率字典。但是请记住, 只能通过.items()函数访问字典中的键值对。如果你忘记了这一点, Python甚至不会抱怨, 而只会返回它遇到的第一个键。换句话说:如果你遍历字典, 并且代码的行为很奇怪, 请在开始尖叫之前检查是否添加了.items()函数。
第二个参数指定应使用第一个参数的哪一部分进行排序:key = lambda item:item [1]。同样, 你将不得不更深入地研究Python语言, 以了解其含义。第一部分很容易解释:你希望对键进行排序。
但是lambda在那做什么?
嗯, lambda函数是一个匿名函数, 这意味着它是一个没有名称的函数, 不能从外部调用。这不是讨论全部内容的时候, 也不是时间, 但是它是使用单个功能循环遍历整个对象范围的另一种方法。在这种情况下, 它仅使用字典值(item [1], 其中item [0]为键)作为排序参数。
第三个也是最后一个参数, reverse, 指定排序是升序(默认)还是降序。在这种情况下, 你希望在顶部看到最常用的单词, 并需要明确指定reverse = True。
如果你现在要立即查看已排序项目的顶部, 那么主宰该频率列表的词语将使你感到失望。这些仅仅是”功能词”, 例如” the”, ” and”, ” a”等。英语(当然还有许多其他语言)充满了这些词, 但是它们主要用于将语言粘合在一起, 它们孤立地没有意义。
在文本分析中, 所谓的停止列表用于从分析中删除这些频繁出现的单词。我们再次忽略最前10%的单词, 而只考虑频率最高的90%的单词, 从而采用了更为基本的方法。你会看到, 该列表的顶部提供了更多有趣的, 负面加载的单词, 例如”不舒服”和”令人沮丧”, 但也提供了正面的单词, 例如”着迷”和”出色”。
你可以对切片进行试验, 以查看可以在数据的哪些部分中找到有趣的单词。
字典与Python列表, NumPy数组和Pandas DataFrames的比较
字典是Python固有的基本数据结构, 允许你将数据放入Python对象中以进行进一步处理。除了列表和元组, 它们是Python必须提供的基本但功能最强大和最灵活的数据结构之一。但是, 最近, 很多字典功能可以被Pandas取代, 并且确实被Pandas取代, Pandas是一个Python数据分析库, 它可以将更多的数据处理和分析保留在Python内, 而不是强迫你作为数据科学家使用专门的统计信息编程语言(最著名的是R)。
如果有现成的图书馆可供使用, 为什么还要烦恼掌握什么字典可以做呢?
好吧, 尝试跑步之前学习走路总是一件好事。
无疑, 像Pandas这样的库使数据科学家可以更快, 更高效地工作, 因为它们不再需要担心数据存储方式的底层细节。但是, Pandas还使用字典(NumPy数组等其他高级数据结构之后)来存储其数据。因此, 在离开繁重的工作(即将数据存储在适当的数据结构中)之前, 了解字典的工作方式是一个好主意。
即使在使用Pandas时, 有时还是建议在情况需要时仍使用Python字典, 例如, 仅需要映射值而你不需要Pandas功能就可以使用Python字典。在这种情况下, 使用熊猫对象只是效率低下和过度杀伤。
最后, Pandas包含将字典转换为Pandas DataFrame的功能, 反之亦然, 并且数据帧可以包含字典。两者的确是现代数据科学家工具箱中非常有用的部分。
下一步是什么?
恭喜你!你已经到达我们的Python字典教程的结尾!
通过参加srcmini的免费的Python数据科学入门课程来完成学习, 以了解有关进行数据科学所需的Python基础知识的更多信息, 以及参加数据科学的中级Python课程以了解更多关于控制流的知识。如果你准备继续学习熊猫, 请不要错过我们的熊猫基础课程。
如果你正在寻找更多教程, 请查看Python列表教程, Pandas教程或NumPy教程。
评论前必须登录!
注册