Python 的数据结构和基本语法
Python 的介绍
Python 是一门面向对象、直译式编程语言,编写简单、上手迅速,开源扩展包十分丰富,所以在数据挖掘的前沿科研和工业领域都广受欢迎,有着瑞士军刀般的价值。利用 Python,可以非常方便地开展各种领域的数据挖掘工作。
后续,如果没有特殊说明,一般使用的是 Python 3 的语法。因为 Python 3 相比 2 有了很大的调整和改进,对中文的支持也更加友好。
下面先来看一下为什么要用 Python 进行数据挖掘。
Python 的优、缺点
1. 优点
-
简单易学:Python 的代码比较简洁、语法比较规范,甚至有点像伪代码,很容易上手。如果有其他编程语言基础的话,那么学习 Python 就会变得很快。如果没有学过,也不要担心,市面上关于 Python 入门的课程非常多,足够满足需求。
-
开源:因为用户可以免费使用,所以不管是在工作中,还是在学习中,使用 Python 的人群都很多,这使得各种更新包层出不穷。
-
可移植性好:在不同的平台都可以运行,不管是 MacOS、Windows 还是 Linux,唯一需要注意的是运行环境的配置。比如 Python 中各种包的依赖关系,如果处理不好将导致程序无法运行,要注意避免。下一节会介绍一种常用的包管理办法。
-
可扩展性:Python 拥有丰富的第三方库,不管是文件操作、网络编程、各种数据库,还是 3D 图形编程都可以运用到。
2. 缺点
通常来说 Python 的缺点就 1 个,为了使语言更加简便易懂,Python 在底层做了很多工作,所以其运行速度比 C、Java 等要慢很多。如果非要说还有什么缺点,由于各种扩展库太庞大,导致配置这些相关包有些困难,比如不同版本的包可能存在不兼容的情况,甚至是 Python 语言本身,在从 2.x 版本升级到 3.x 版本后,很多语句和功能都发生了变化,无法跨版本运行。
了解了 Python 的特点之后,来看一下它的数据类型,这对编写代码有很大的帮助。
Python 支持的数据类型
Python 支持的数据类型,如下表所示:
| 类型名 | 说明 | 描述 |
|---|---|---|
| str | 字符串类型 | 一段字符串 |
| int | 整型 | 整数,比如 1、 2、3 |
| float | 浮点型 | 比如 0.1、0.315 |
| bool | 逻辑值 | true or false |
| complex | 复数 | 数学上的概念 |
| bytes | 字节型 | 原始的数据类型,可以理解为 01 代码 |
| list | 列表 | 有序可修改的列表 |
| tuple | 元组 | 元组比较特别,它是一个不可以修改的有序列表 |
| set | 集合 | 无序,唯一的值的合集 |
| dict(map) | 字典 | 类似于 map |
Python 的数据类型有一个特色,在声明一个变量的时候可以不声明它的类型,而是在赋值时才确定类型。同时在声明的容器型变量(如下面提到的列表、字典等)中,内部的元素类型也是任意的。
由于列表、集合和字典将非常频繁地使用,尤其是在数据挖掘过程中,数据通常都会以向量的方式表示、存储在列表中。所以掌握这些数据类型,以及它们的各种扩展方法是非常有好处的。下面会对上述常用的三种数据进行详细的说明,当然数据结构类型远远不止这几种情况,如果有兴趣,可以找其他资料进行深入了解学习。
1. 列表(list)
列表可以理解为是一个有序可重复的数组,主要用于按顺序存放数据。
首先举个例子,下面是一个为列表赋值的语句:
list=['one','two',3,4,5]通过该语句生成了一个列表,即 list,里面有 5 个元素,但它们的类型不一样,前 2 个是字符串,后 3 个是数字。
列表中的元素是有序的,每个元素都有一个位置标记,并且元素可以重复。比如下面这两个语句,即用列表的位置下标来获取对应的元素并输出。输出 list[0] 会得到 'one' 这个单词,因为 one 存放在了 list 的第 0 个位置,而输出 list[4] 会得到数字 5,因为数字 5 存放在了 list 的第 4 个位置,注意,在计算机语言中,一般位置标识都是从 0 开始的。
print(list[0]) #输出 one
print(list[4]) #输出 5列表的基本操作主要有添加、删除、修改等功能,同时 Python 还提供了一系列的扩展功能,如查询列表长度、列表运算,等等。
- 添加元素
list.append(x) #向列表中加入一个新的元素 x- 删除元素
del list[2] #删除了位于位置 2 的元素。注意,此时后面的元素会补充进来,所以位置 2 上仍然是有元素的- 修改元素、查询列表长度、列表的运算以及判断某一元素是否在列表中
list[2] = 'three' #修改位于位置 2 的列表元素
len(list) #返回列表的长度
list1+list2 #列表相加,返回一个新的列表,里面按顺序有 list1 和 list2 的所有元素
list1 * 2 #列表重复,返回一个新的列表,里面按顺序出现 list1 中的元素两次
x in list #判断 list 中是否有 x 这个元素除了上述的操作,列表还有很多已经实现好的方法可供使用,比如列表排序、找到最大值和最小值、逆序排列等。由于功能模块非常多,当有需要的时候可以根据自己的需求进行查询。
2. 集合(set)
集合是一个无序的不重复序列,可以使用大括号 { } 或者 set() 函数创建集合。需要注意的是,创建一个空集合必须用 set() 而不能用 { },因为 { } 是用来创建一个空字典的。
比如,要新建一个叫 abc 的集合:
abc=set() #这时候我们就创建了一个空集合- 添加元素
abc.add(x) #向 abc 中加入元素 x- 删除元素
abc.remove(x) #从 abc 中删除元素 x3. 字典(dict)
字典中存放的每一个元素实际上是一个键值对(key:value),其中 key 是不能重复的,存入相同的 key,它的 value 会被替换成最新的。dict={} 代表使用大括号声明一个空字典。
字典中的元素可以是任意类型,比如数值、字符串、列表,甚至是字典:
dict={'a':1,'b':2,5:4}- 向字典中添加键值对
dict['c']=3- 从字典中删除键值对
del dict['a'] #只需要标记 key 就删除了键值对了解了数据类型,就可以进行简单的语句书写了,不过每种语言都有自己的书写习惯,所以在正式进入代码编写前,需要说明一下 Python 的四个注意事项。
编写 Python 代码的注意事项
1. 标识符
标识符就是定义的名称,包括类名、变量名,等等。在 Python 中,标识符的大小写是敏感的,且第一个字符必须是字母表中的字母或"_"。在 Python 3 中,甚至中文也可被用作变量名。
当然,Python 有一些自留标识符,比如 def、true、false 等,不能再使用这些作为标识符。
2. 注释
注释是为了方便阅读代码写的内容,这些内容将不会被解释器解释执行。Python 中有两种注释方法:
-
第一种是注释单行,可以使用"#",出现在"#"后面的该行内容将变成注释(如上面代码块中"#输出 one"等),不会被运行;
-
第二种是注释一段,可以使用 ''' 或者 """ 来处理多行注释,比如:
'''
这是一段注释
这一段内容主要用来说明
好了 这段注释就到这里了
'''3. 使用缩进来标记代码块
在很多编程语言中,比如 C++ 和 Java,都是使用大括号 {} 来对代码段进行分割的,但是在 Python 中不需要,而是使用缩进来对代码段进行控制。所以在编写 Python 代码的时候,一定要非常注意缩进规范。
如果使用 IDE(Integrated Development Environment ,集成开发环境)来编辑代码,一般都会有缩进提醒,但使用文本编辑器就可能会经常遇到缩进的问题了。
比如下面这段正确的代码,就是使用缩进来标记的:
if a>b:
print("yes")
else:
print("no")如果写成对齐的样子就会出错,无法输出结果:
if a>b:
print("yes")
else:
print("no")如果一行代码实在太长,需要把它分割成多行来写,可以使用"\ "进行连接,比如:
num = num + \
a + \
b + \
c如果是在括号里的内容,那就不需要使用"\ ",直接换行就行了。
4. 导入其他模块
在 Python 的扩展中,有很多第三方编写的模块,并且在组织大型项目代码的时候,也会把代码分成好多的模块,这里就涉及导入或者说是引用的问题了。
这时候要用到两个命令 import 或者 from…import。import 的主要作用是导入整个模块,或者导入模块中的模块;而 from…import 是从某个模块中导入某个方法(函数),比如:
import tensorflow as tf #导入 tensorflow 模块,并起一个新名字 tf,这主要是为了方便代码编写
from model import yolov3 #从 model 模块导入 yolov3 方法
from math import * #从 math 模块导入所有方法到这里,Python 的基本知识已经介绍完毕,可以开始学习语句,进行代码编写了。
常用语句
Python 的语句有很多种,这里只介绍 3 种常用的,包括条件语句、循环语句和 pass 语句,剩下的语句,如运算符、各种函数功能模块,可以通过搜索资料自行学习。
1. 条件语句
条件判断是最常用到的方法,可以用来各种情况的判定,从而影响语句的执行,使用方法如下:
if 条件:
执行
elif 条件:
执行
else:
执行
#具体的例子,找到 a、b、c 中最大的数,其中 and 是逻辑运算符"且"的意思
if a>b and a>c:
print(a)
elif b>a and b>c:
print(b)
else:
print(c)2. 循环语句
循环语句相关的主要有 while 语句、for 语句、continue 语句、break 语句。
- while 循环
#a>b 循环输出a,b加1,直到 a<=b 循环终止
while a>b:
print(a)
b=b+1- for 循环
#i 在区间 0-100 循环输出 i,即从 0 开始到 100 循环终止
for i in range(0,100):
print(i)- continue 跳过
#i 在区间 0-100 循环输出 i,但是如果 i 小于 50 就跳过本次,下面的 print 语句得不到执行,一直循环到 i>=50 才会执行 print
for i in range(0,100):
if i < 50:
continue
print(i)- break 终止循环
#i 在区间 0-100 循环输出 i,当 i>50 的时候遇到 break,该循环被终止了,所以这个循环只能输出前 50 次
for i in range(0,100):
print(i)
if i > 50:
break3. pass 语句
在 Python 中有一个特别的语句,那就是 pass 语句,该语句代表什么都没有,主要用于一些特殊的位置。如果在一段代码中必须要写一些语句,又不能产生任何影响,就可以使用 pass 语句。
比如想写一个代码,当 i<50 的时候什么都不做,就可以这么写:
for i in range(0,100):
print(i)
if i < 50:
pass
else
print(i)在实际编写代码的时候,有些位置可能想要写一些功能,但是还没有想好要怎么写,比如定义了一个函数,但是函数的具体内容还没确定,此时就可以预留出一些位置暂时写上 pass 语句,从而不会影响代码的运行。
工欲善其事,必先利其器。想用 Python 写出漂亮的代码,没有合适的编辑器怎么行。下面介绍 5 种 Python 编辑器,以便找到合适的工具。
Python 的编辑器
1. PyCharm
PyCharm 是由大名鼎鼎的 JetBrains 开发的,它是一款 Python 专用 IDE,功能十分强大,开发版是免费的,通常可以满足一般开发者的需求,但如果有大型项目开发的需求,那么可以选择购买一个专业版的。

PyCharm 界面图
2. Spyder
推荐这个 IDE 的不多,但是在 Anaconda(下一节会具体介绍)中集成了这个 IDE,而且是免费的,所以在测试环境下,经常使用它进行代码编写,它的功能没有 PyCharm 那么强大,但对于日常实验也够用了。

Spyder 界面图
3. VIM
VIM 在 Linux 系统上,尤其是服务器上,是最常用的文本编辑软件。

VIM 界面图
4. Sublime
SublimeText 是一款用于代码、标记和散文的精致文本编辑器,它与 VIM 一样都属于文本编辑器,界面简洁清爽,反应十分迅速,但其优势是扩展了代码开发的功能,支持代码高亮、语法提示等功能。

Sublime 界面图
5.Jupyter Notebook
Jupyter Notebook 是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。
它的好处就是轻量,而且对于数据的可视化非常友好,对于一些小型实验,或者数据分析,使用Jupyter Notebook 非常方便。
在 Anaconda 里面也集成了 Jupyter Notebook,有兴趣可以深入探索。

Jupyter Notebook 界面图
总结
因为后续会使用 Python 编写代码,所以这一节介绍了一些 Python 语言的基础知识。由于篇幅的限制,这里所列出的只是该语言中最最基本的部分,有很多细节都没有一一展开。如果对实际的代码编写有很大兴趣,可以自己购买一些书籍或课程进行更加深入的学习。
版本差异(Pandas 1.x/2.x → 3.0.x)
| 特性 | 本文编写时 | 当前(Pandas 3.0.x) |
|---|---|---|
| 版本基线 | 1.x / 2.x | 3.0 为最新稳定版(重大版本) |
| Copy-on-Write | 需手动开启 | 3.0 起 默认开启:视图/副本语义更安全,链式赋值不再静默修改 |
| 字符串类型 | object 存储 | 3.0 起 str dtype 默认使用 StringDtype,性能与语义更好 |
inplace 参数 | 普遍可用 | 2.x 起逐步弃用,3.0 移除多数 inplace;改用 df = df.method() |
| 时间序列 | pd.date_range 等 | 不变;Timestamp 默认纳秒精度 |
| 依赖 | numpy 1.x | 要求 numpy 1.26+/2.x |
本文讲解的 DataFrame 核心 API(索引、筛选、清洗、聚合)在 3.0 中兼容;升级重点:Copy-on-Write 默认开启、
inplace移除、字符串 dtype 变化。